aoqi@0: /* aoqi@0: * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. aoqi@0: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. attila@962: * aoqi@0: * This code is free software; you can redistribute it and/or modify it aoqi@0: * under the terms of the GNU General Public License version 2 only, as aoqi@0: * published by the Free Software Foundation. attila@962: * aoqi@0: * This code is distributed in the hope that it will be useful, but WITHOUT aoqi@0: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or aoqi@0: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License aoqi@0: * version 2 for more details (a copy is included in the LICENSE file that aoqi@0: * accompanied this code). attila@962: * aoqi@0: * You should have received a copy of the GNU General Public License version aoqi@0: * 2 along with this work; if not, write to the Free Software Foundation, aoqi@0: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. attila@962: * aoqi@0: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA aoqi@0: * or visit www.oracle.com if you need additional information or have any aoqi@0: * questions. aoqi@0: */ aoqi@0: aoqi@0: /** aoqi@0: * JDK-8044520: Nashorn cannot execute node.js's express module aoqi@0: * aoqi@0: * @test aoqi@0: * @run aoqi@0: */ aoqi@0: aoqi@0: function checkNullProto() { aoqi@0: var obj = {}; aoqi@0: obj.__proto__ = null; aoqi@0: var proto = Object.getPrototypeOf(obj); aoqi@0: if (typeof proto != 'object' || proto !== null) { aoqi@0: fail("__proto__ can't be set to null!"); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: checkNullProto(); aoqi@0: aoqi@0: function checkSetProto(proto) { aoqi@0: var obj = {}; aoqi@0: obj.__proto__ = proto; aoqi@0: if (Object.getPrototypeOf(obj) !== Object.prototype) { aoqi@0: fail("obj.__proto__ set not ignored for " + proto); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: checkSetProto(undefined); aoqi@0: checkSetProto(42); aoqi@0: checkSetProto(false); aoqi@0: checkSetProto("hello"); aoqi@0: aoqi@0: function checkLiteralSetProto(proto) { aoqi@0: var obj = { __proto__: proto }; aoqi@0: if (obj.__proto__ !== Object.prototype) { aoqi@0: fail("object literal _proto__ set not ignored for " + proto); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: checkLiteralSetProto(undefined); aoqi@0: checkLiteralSetProto(34); aoqi@0: checkLiteralSetProto(true); aoqi@0: checkLiteralSetProto("world"); aoqi@0: aoqi@0: function checkNullProtoFromLiteral() { aoqi@0: var obj = { __proto__: null }; aoqi@0: var proto = Object.getPrototypeOf(obj); aoqi@0: if (typeof proto != 'object' || proto !== null) { aoqi@0: fail("__proto__ can't be set to null!"); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: checkNullProtoFromLiteral(); aoqi@0: aoqi@0: function checkSetPrototypeOf(proto) { aoqi@0: try { aoqi@0: Object.setPrototypeOf({}, proto); aoqi@0: fail("should have thrown error for " + proto); aoqi@0: } catch (e) { aoqi@0: if (! (e instanceof TypeError)) { aoqi@0: fail("should have thrown TypeError, got " + e); aoqi@0: } aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: checkSetPrototypeOf(undefined); aoqi@0: checkSetPrototypeOf(43); aoqi@0: checkSetPrototypeOf(false); aoqi@0: checkSetPrototypeOf("nashorn"); aoqi@0: aoqi@0: function checkNullSetPrototypeOf() { aoqi@0: var obj = { }; aoqi@0: Object.setPrototypeOf(obj, null); aoqi@0: var proto = Object.getPrototypeOf(obj); aoqi@0: if (typeof proto != 'object' || proto !== null) { aoqi@0: fail("__proto__ can't be set to null!"); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: checkNullSetPrototypeOf(); aoqi@0: aoqi@0: var desc = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__"); aoqi@0: aoqi@0: function checkProtoGetterOnPrimitive(value) { aoqi@0: // call __proto__ getter on primitive - check ToObject aoqi@0: // is called on 'this' value as per draft spec aoqi@0: if (desc.get.call(value) !== Object(value).__proto__) { aoqi@0: fail("can't call __proto__ getter on " + value); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: checkProtoGetterOnPrimitive(32); aoqi@0: checkProtoGetterOnPrimitive(false); aoqi@0: checkProtoGetterOnPrimitive("great!"); aoqi@0: aoqi@0: function checkProtoSetterOnNonObjectThis(self) { aoqi@0: try { aoqi@0: desc.set.call(self); aoqi@0: fail("should have thrown TypeError"); aoqi@0: } catch (e) { aoqi@0: if (! (e instanceof TypeError)) { aoqi@0: fail("should throw TypeError on non-object self, got " +e); aoqi@0: } aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: checkProtoSetterOnNonObjectThis(undefined); aoqi@0: checkProtoSetterOnNonObjectThis(null); aoqi@0: aoqi@0: function checkProtoSetterReturnValue(obj, p) { aoqi@0: if (typeof desc.set.call(obj, p) != "undefined") { aoqi@0: fail("__proto__ setter does not return undefined: " + obj + " " + p); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: // try non-object 'this'. setter is expected to return undefined. aoqi@0: checkProtoSetterReturnValue(23); aoqi@0: checkProtoSetterReturnValue(false); aoqi@0: checkProtoSetterReturnValue("foo"); aoqi@0: aoqi@0: // set proper __proto__. Still return value is undefined. aoqi@0: checkProtoSetterReturnValue({}, {}); aoqi@0: checkProtoSetterReturnValue({}, null);