# HG changeset patch # User attila # Date 1400079908 -7200 # Node ID f5e65b5652302701290574ebe1abb87e2f32ca17 # Parent 0c15d49a19cc01d9277f5d99eada2e569f2812fd 8043133: Fix corner cases of JDK-8041995 Reviewed-by: hannesw, lagergren diff -r 0c15d49a19cc -r f5e65b565230 nashorn/src/jdk/nashorn/internal/codegen/CodeGenerator.java --- a/nashorn/src/jdk/nashorn/internal/codegen/CodeGenerator.java Wed May 14 15:50:04 2014 +0200 +++ b/nashorn/src/jdk/nashorn/internal/codegen/CodeGenerator.java Wed May 14 17:05:08 2014 +0200 @@ -2213,6 +2213,11 @@ public Boolean get() { value.accept(new NodeVisitor(new LexicalContext()) { @Override + public boolean enterFunctionNode(FunctionNode functionNode) { + return false; + } + + @Override public boolean enterDefault(final Node node) { if (contains) { return false; @@ -2257,7 +2262,6 @@ restOfProperty |= value != null && isValid(ccp) && - value instanceof Optimistic && propertyValueContains(value, ccp); //for literals, a value of null means object type, i.e. the value null or getter setter function @@ -2288,6 +2292,8 @@ //handler if (restOfProperty) { final ContinuationInfo ci = getContinuationInfo(); + // Can be set at most once for a single rest-of method + assert ci.getObjectLiteralMap() == null; ci.setObjectLiteralMap(oc.getMap()); ci.setObjectLiteralStackDepth(method.getStackSize()); } @@ -5094,6 +5100,7 @@ final int[] stackStoreSpec = ci.getStackStoreSpec(); final Type[] stackTypes = ci.getStackTypes(); final boolean isStackEmpty = stackStoreSpec.length == 0; + boolean replacedObjectLiteralMap = false; if(!isStackEmpty) { // Load arguments on the stack final int objectLiteralStackDepth = ci.getObjectLiteralStackDepth(); @@ -5110,10 +5117,12 @@ assert ScriptObject.class.isAssignableFrom(method.peekType().getTypeClass()) : method.peekType().getTypeClass() + " is not a script object"; loadConstant(ci.getObjectLiteralMap()); method.invoke(ScriptObject.SET_MAP); + replacedObjectLiteralMap = true; } } } - + // Must have emitted the code for replacing the map of an object literal if we have a set object literal stack depth + assert ci.getObjectLiteralStackDepth() == -1 || replacedObjectLiteralMap; // Load RewriteException back. method.load(rewriteExceptionType, lvarCount); // Get rid of the stored reference diff -r 0c15d49a19cc -r f5e65b565230 nashorn/test/script/basic/JDK-8043133.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8043133.js Wed May 14 17:05:08 2014 +0200 @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * JDK-8043133: Fix corner cases of JDK-8041995 + * + * @test + * @run + */ + +var x = {} +var b = false; +// Ternary expression is not optimistic, yet the analyzer must still +// find the optimistic subexpression f() that triggered deoptimizing +// recompilation. +Object.defineProperty(x, 'foo', { value: b ? b : f() }); +print(x.foo); // Must print "Hello world" instead of 0 + +function f() { + return "Hello World!" +} diff -r 0c15d49a19cc -r f5e65b565230 nashorn/test/script/basic/JDK-8043133.js.EXPECTED --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8043133.js.EXPECTED Wed May 14 17:05:08 2014 +0200 @@ -0,0 +1,1 @@ +Hello World!