/* * 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-8016618: script mirror object access should be improved * * @test * @option -scripting * @option -strict * @run */ var global = loadWithNewGlobal({ name: "code", script: <<EOF var x = 33; function func(x, y) { print('func.x = ' + x); print('func.x = ' + y) }; var obj = { foo: 'hello', bar: 42 }; Object.defineProperty(obj, "bar", { enumerable: false, writable: false }); // return global this; EOF }); // load on mirror with local object as argument global.load({ name: "code", script: "print('x = ' + x)" }); function f() { // mirror function called with local arguments // global.func.apply(obj, arguments); global.func.apply(obj, arguments); } f(23, "hello"); f(24, "hello2"); var oldCall = Function.prototype.call; Function.prototype.call = function() { throw "this should never happen! go back to apply!"; }; f(25, "hello3"); Function.prototype.call = oldCall; var fObject = global.eval("Object"); // instanceof on mirrors print("global instanceof fObject? " + (global instanceof fObject)); // Object API on mirrors var desc = Object.getOwnPropertyDescriptor(global, "x"); print("x is wriable ? " + desc.writable); print("x value = " + desc.value); var proto = Object.getPrototypeOf(global); print("global's __proto__ " + proto); var obj = global.obj; var keys = Object.keys(obj); print("Object.keys on obj"); for (var i in keys) { print(keys[i]); } print("Object.getOwnProperties on obj"); var keys = Object.getOwnPropertyNames(obj); for (var i in keys) { print(keys[i]); } // mirror array access var array = global.eval("[334, 55, 65]"); Array.prototype.forEach.call(array, function(elem) { print("forEach " + elem) }); print("reduceRight " + Array.prototype.reduceRight.call(array, function(previousValue, currentValue, index, array) { print("reduceRight cur value " + currentValue); return previousValue + currentValue; }, 0)); print("reduce " + Array.prototype.reduce.call(array, function(previousValue, currentValue, index, array) { print("reduce cur value " + currentValue); return previousValue + currentValue; }, 0)); print("forEach"); Array.prototype.forEach.call(array, function(o) { print(o); }); print("Array.isArray(array)? " + Array.isArray(array)); // try to write to a non-writable property of mirror try { obj.bar = 33; } catch (e) { print(e); } // mirror function called with local callback print("forEach on mirror"); array.forEach(function(toto) { print(toto); });