--- old/src/jdk/nashorn/internal/codegen/CodeGenerator.java 2014-05-06 13:28:30.133775588 +0530 +++ new/src/jdk/nashorn/internal/codegen/CodeGenerator.java 2014-05-06 13:28:29.861774234 +0530 @@ -1451,7 +1451,10 @@ if (value == null) { hasGettersSetters = true; - } else if (key.equals(ScriptObject.PROTO_PROPERTY_NAME)) { + } else if (propertyNode.getKey() instanceof IdentNode && + key.equals(ScriptObject.PROTO_PROPERTY_NAME)) { + // ES6 draft compliant __proto__ inside object literal + // Identifier key and name is __proto__ protoNode = value; continue; } --- old/src/jdk/nashorn/internal/objects/Global.java 2014-05-06 13:28:30.985779813 +0530 +++ new/src/jdk/nashorn/internal/objects/Global.java 2014-05-06 13:28:30.805778915 +0530 @@ -1906,6 +1906,13 @@ // Object.getPrototypeOf(Function.prototype) === Object.prototype anon.setInitialProto(ObjectPrototype); + // ES6 draft compliant __proto__ property of Object.prototype + // accessors on Object.prototype for "__proto__" + final ScriptFunction getProto = ScriptFunctionImpl.makeFunction("getProto", ScriptObject.GETPROTO); + final ScriptFunction setProto = ScriptFunctionImpl.makeFunction("setProto", ScriptObject.SETPROTOCHECK); + ObjectPrototype.addOwnProperty("__proto__", Attribute.NOT_ENUMERABLE, getProto, setProto); + + // Function valued properties of Function.prototype were not properly // initialized. Because, these were created before global.function and // global.object were not initialized. --- old/src/jdk/nashorn/internal/runtime/ScriptObject.java 2014-05-06 13:28:31.601782867 +0530 +++ new/src/jdk/nashorn/internal/runtime/ScriptObject.java 2014-05-06 13:28:31.453782128 +0530 @@ -91,7 +91,7 @@ */ public abstract class ScriptObject implements PropertyAccess { - /** __proto__ special property name */ + /** __proto__ special property name inside object literals. ES6 draft. */ public static final String PROTO_PROPERTY_NAME = "__proto__"; /** Search fall back routine name for "no such method" */ @@ -130,8 +130,8 @@ /** Indexed array data. */ private ArrayData arrayData; - static final MethodHandle GETPROTO = findOwnMH("getProto", ScriptObject.class); - static final MethodHandle SETPROTOCHECK = findOwnMH("setProtoCheck", void.class, Object.class); + public static final MethodHandle GETPROTO = findOwnMH("getProto", ScriptObject.class); + public static final MethodHandle SETPROTOCHECK = findOwnMH("setProtoCheck", void.class, Object.class); static final MethodHandle MEGAMORPHIC_GET = findOwnMH("megamorphicGet", Object.class, String.class, boolean.class, boolean.class); static final MethodHandle GLOBALFILTER = findOwnMH("globalFilter", Object.class, Object.class); @@ -1732,10 +1732,6 @@ MethodHandle methodHandle; if (find == null) { - if (PROTO_PROPERTY_NAME.equals(name)) { - return new GuardedInvocation(GETPROTO, NashornGuards.getScriptObjectGuard()); - } - if ("getProp".equals(operator)) { return noSuchProperty(desc, request); } else if ("getMethod".equals(operator)) { @@ -1890,9 +1886,7 @@ return createEmptySetMethod(desc, "property.not.writable", true); } } else { - if (PROTO_PROPERTY_NAME.equals(name)) { - return new GuardedInvocation(SETPROTOCHECK, NashornGuards.getScriptObjectGuard()); - } else if (! isExtensible()) { + if (! isExtensible()) { return createEmptySetMethod(desc, "object.non.extensible", false); } } --- old/test/script/basic/JDK-8024120.js 2014-05-06 13:28:32.457787112 +0530 +++ new/test/script/basic/JDK-8024120.js 2014-05-06 13:28:32.293786294 +0530 @@ -32,10 +32,6 @@ obj.__proto__ = null; -if (obj.__proto__ !== null || typeof(obj.__proto__) != 'object') { - fail("obj.__proto__ is expected to be null"); -} - var p = Object.getPrototypeOf(obj); if (p !== null || typeof(p) != 'object') { fail("Object.getPrototypeOf(obj) is expected to be null"); --- old/test/script/basic/JDK-8024174.js 2014-05-06 13:28:33.005789823 +0530 +++ new/test/script/basic/JDK-8024174.js 2014-05-06 13:28:32.885789227 +0530 @@ -46,6 +46,6 @@ __proto__: null }; -if (obj2.__proto__ !== null || Object.getPrototypeOf(obj2) !== null) { +if (Object.getPrototypeOf(obj2) !== null) { fail("obj2.__proto__ was not set to null inside literal"); } --- /dev/null 2014-05-06 11:50:48.808016550 +0530 +++ new/test/script/basic/JDK-8042364.js 2014-05-06 13:28:33.373791649 +0530 @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2014, 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-8042364: Make __proto__ ES6 draft compliant + * + * @test + * @run + */ + +// check for Object.prototype.__proto__ accessor property +print("Object.prototype has __proto__?", + Object.prototype.hasOwnProperty("__proto__")) + +var desc = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__") +print("descriptor"); +print(JSON.stringify(desc)) +print("getter", desc.get) +print("setter", desc.set) + +// no computed "__proto__" name, only identifier! +var p = {} +var obj = { + "__proto__" : p +} + +if (Object.getPrototypeOf(obj) === p) { + fail("obj has wrong __proto__, allows computed __proto__!") +} + +if (obj.__proto__ !== p) { + fail("__proto__ not created as normal property!") +} + +if (Object.getPrototypeOf(obj) !== Object.prototype) { + fail("obj has wrong __proto__") +} + +var obj2 = { + __proto__: p +} + +if (Object.getPrototypeOf(obj2) !== p) { + fail("can't set __proto__ in object literal") +} --- /dev/null 2014-05-06 11:50:48.808016550 +0530 +++ new/test/script/basic/JDK-8042364.js.EXPECTED 2014-05-06 13:28:33.869794109 +0530 @@ -0,0 +1,5 @@ +Object.prototype has __proto__? true +descriptor +{"configurable":true,"enumerable":false} +getter function getProto() { [native code] } +setter function setProto() { [native code] }