Mercurial > hg > openjdk > jdk8u > nashorn
changeset 1966:3c3b4e793e7c jdk8u122-b04
Merge
author | robm |
---|---|
date | Thu, 20 Oct 2016 13:40:34 +0000 |
parents | b0f91662ee0c (current diff) 64034f7f4f5e (diff) |
children | 30dc0c72f3d0 |
files | |
diffstat | 4 files changed, 78 insertions(+), 49 deletions(-) [+] |
line wrap: on
line diff
--- a/ASSEMBLY_EXCEPTION Tue Oct 18 13:06:49 2016 -0700 +++ b/ASSEMBLY_EXCEPTION Thu Oct 20 13:40:34 2016 +0000 @@ -1,27 +1,27 @@ OPENJDK ASSEMBLY EXCEPTION -The OpenJDK source code made available by Sun at openjdk.java.net and -openjdk.dev.java.net ("OpenJDK Code") is distributed under the terms of the -GNU General Public License <http://www.gnu.org/copyleft/gpl.html> version 2 +The OpenJDK source code made available by Oracle America, Inc. (Oracle) at +openjdk.java.net ("OpenJDK Code") is distributed under the terms of the GNU +General Public License <http://www.gnu.org/copyleft/gpl.html> version 2 only ("GPL2"), with the following clarification and special exception. Linking this OpenJDK Code statically or dynamically with other code is making a combined work based on this library. Thus, the terms and conditions of GPL2 cover the whole combination. - As a special exception, Sun gives you permission to link this - OpenJDK Code with certain code licensed by Sun as indicated at + As a special exception, Oracle gives you permission to link this + OpenJDK Code with certain code licensed by Oracle as indicated at http://openjdk.java.net/legal/exception-modules-2007-05-08.html ("Designated Exception Modules") to produce an executable, regardless of the license terms of the Designated Exception Modules, and to copy and distribute the resulting executable under GPL2, provided that the Designated Exception Modules continue to be - governed by the licenses under which they were offered by Sun. + governed by the licenses under which they were offered by Oracle. -As such, it allows licensees and sublicensees of Sun's GPL2 OpenJDK Code to -build an executable that includes those portions of necessary code that Sun -could not provide under GPL2 (or that Sun has provided under GPL2 with the -Classpath exception). If you modify or add to the OpenJDK code, that new -GPL2 code may still be combined with Designated Exception Modules if the -new code is made subject to this exception by its copyright holder. +As such, it allows licensees and sublicensees of Oracle's GPL2 OpenJDK Code +to build an executable that includes those portions of necessary code that +Oracle could not provide under GPL2 (or that Oracle has provided under GPL2 +with the Classpath exception). If you modify or add to the OpenJDK code, +that new GPL2 code may still be combined with Designated Exception Modules +if the new code is made subject to this exception by its copyright holder.
--- a/src/jdk/nashorn/internal/codegen/CodeGenerator.java Tue Oct 18 13:06:49 2016 -0700 +++ b/src/jdk/nashorn/internal/codegen/CodeGenerator.java Thu Oct 20 13:40:34 2016 +0000 @@ -2454,11 +2454,6 @@ } @Override - public boolean enterObjectNode(final ObjectNode objectNode) { - return false; - } - - @Override public boolean enterDefault(final Node node) { if (contains) { return false; @@ -2526,7 +2521,8 @@ oc = new FieldObjectCreator<Expression>(this, tuples) { @Override protected void loadValue(final Expression node, final Type type) { - loadExpressionAsType(node, type); + // Use generic type in order to avoid conversion between object types + loadExpressionAsType(node, Type.generic(type)); }}; } @@ -2542,10 +2538,7 @@ //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()); + ci.setObjectLiteralMap(method.getStackSize(), oc.getMap()); } method.dup(); @@ -5259,10 +5252,8 @@ private Type[] stackTypes; // If non-null, this node should perform the requisite type conversion private Type returnValueType; - // If we are in the middle of an object literal initialization, we need to update the map - private PropertyMap objectLiteralMap; - // Object literal stack depth for object literal - not necessarily top if property is a tree - private int objectLiteralStackDepth = -1; + // If we are in the middle of an object literal initialization, we need to update the property maps + private Map<Integer, PropertyMap> objectLiteralMaps; // The line number at the continuation point private int lineNumber; // The active catch label, in case the continuation point is in a try/catch block @@ -5314,20 +5305,15 @@ this.returnValueType = returnValueType; } - int getObjectLiteralStackDepth() { - return objectLiteralStackDepth; - } - - void setObjectLiteralStackDepth(final int objectLiteralStackDepth) { - this.objectLiteralStackDepth = objectLiteralStackDepth; - } - - PropertyMap getObjectLiteralMap() { - return objectLiteralMap; - } - - void setObjectLiteralMap(final PropertyMap objectLiteralMap) { - this.objectLiteralMap = objectLiteralMap; + void setObjectLiteralMap(final int objectLiteralStackDepth, final PropertyMap objectLiteralMap) { + if (objectLiteralMaps == null) { + objectLiteralMaps = new HashMap<>(); + } + objectLiteralMaps.put(objectLiteralStackDepth, objectLiteralMap); + } + + PropertyMap getObjectLiteralMap(final int stackDepth) { + return objectLiteralMaps == null ? null : objectLiteralMaps.get(stackDepth); } @Override @@ -5417,10 +5403,9 @@ final int[] stackStoreSpec = ci.getStackStoreSpec(); final Type[] stackTypes = ci.getStackTypes(); final boolean isStackEmpty = stackStoreSpec.length == 0; - boolean replacedObjectLiteralMap = false; + int replacedObjectLiteralMaps = 0; if(!isStackEmpty) { // Load arguments on the stack - final int objectLiteralStackDepth = ci.getObjectLiteralStackDepth(); for(int i = 0; i < stackStoreSpec.length; ++i) { final int slot = stackStoreSpec[i]; method.load(lvarTypes.get(slot), slot); @@ -5428,18 +5413,18 @@ // stack: s0=object literal being initialized // change map of s0 so that the property we are initializing when we failed // is now ci.returnValueType - if (i == objectLiteralStackDepth) { + final PropertyMap map = ci.getObjectLiteralMap(i); + if (map != null) { method.dup(); - assert ci.getObjectLiteralMap() != null; assert ScriptObject.class.isAssignableFrom(method.peekType().getTypeClass()) : method.peekType().getTypeClass() + " is not a script object"; - loadConstant(ci.getObjectLiteralMap()); + loadConstant(map); method.invoke(ScriptObject.SET_MAP); - replacedObjectLiteralMap = true; + replacedObjectLiteralMaps++; } } } - // 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; + // Must have emitted the code for replacing all object literal maps + assert ci.objectLiteralMaps == null || ci.objectLiteralMaps.size() == replacedObjectLiteralMaps; // Load RewriteException back. method.load(rewriteExceptionType, lvarCount); // Get rid of the stored reference
--- a/src/jdk/nashorn/internal/codegen/SpillObjectCreator.java Tue Oct 18 13:06:49 2016 -0700 +++ b/src/jdk/nashorn/internal/codegen/SpillObjectCreator.java Thu Oct 20 13:40:34 2016 +0000 @@ -188,7 +188,8 @@ @Override protected void loadValue(final Expression expr, final Type type) { - codegen.loadExpressionAsType(expr, type); + // Use generic type in order to avoid conversion between object types + codegen.loadExpressionAsType(expr, Type.generic(type)); } @Override
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/JDK-8166902.js Thu Oct 20 13:40:34 2016 +0000 @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2016, 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-8166902: Nested object literal property maps not reset in optimistic recompilation + * + * @test + * @run + */ + +var o = { + a: "A", + b: "B" +}; + +var m = { + x: { z: o.a }, + y: o.b +}; + +Assert.assertEquals(m.x.z, "A"); +Assert.assertEquals(m.y, "B"); +