mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 15:24:43 +02:00
8015945: loadWithNewGlobal return value has to be properly wrapped
Reviewed-by: lagergren, hannesw
This commit is contained in:
parent
7ee2adb4d7
commit
1e63ac571c
4 changed files with 106 additions and 12 deletions
|
@ -342,20 +342,28 @@ public final class ScriptObjectMirror extends JSObject implements Bindings {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// package-privates below this.
|
|
||||||
ScriptObject getScriptObject() {
|
|
||||||
return sobj;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Object translateUndefined(Object obj) {
|
// These are public only so that Context can access these.
|
||||||
return (obj == ScriptRuntime.UNDEFINED)? null : obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Object wrap(final Object obj, final ScriptObject homeGlobal) {
|
/**
|
||||||
|
* Make a script object mirror on given object if needed.
|
||||||
|
*
|
||||||
|
* @param obj object to be wrapped
|
||||||
|
* @param homeGlobal global to which this object belongs
|
||||||
|
* @return wrapped object
|
||||||
|
*/
|
||||||
|
public static Object wrap(final Object obj, final ScriptObject homeGlobal) {
|
||||||
return (obj instanceof ScriptObject) ? new ScriptObjectMirror((ScriptObject)obj, homeGlobal) : obj;
|
return (obj instanceof ScriptObject) ? new ScriptObjectMirror((ScriptObject)obj, homeGlobal) : obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Object unwrap(final Object obj, final ScriptObject homeGlobal) {
|
/**
|
||||||
|
* Unwrap a script object mirror if needed.
|
||||||
|
*
|
||||||
|
* @param obj object to be unwrapped
|
||||||
|
* @param homeGlobal global to which this object belongs
|
||||||
|
* @return unwrapped object
|
||||||
|
*/
|
||||||
|
public static Object unwrap(final Object obj, final ScriptObject homeGlobal) {
|
||||||
if (obj instanceof ScriptObjectMirror) {
|
if (obj instanceof ScriptObjectMirror) {
|
||||||
final ScriptObjectMirror mirror = (ScriptObjectMirror)obj;
|
final ScriptObjectMirror mirror = (ScriptObjectMirror)obj;
|
||||||
return (mirror.global == homeGlobal)? mirror.sobj : obj;
|
return (mirror.global == homeGlobal)? mirror.sobj : obj;
|
||||||
|
@ -364,7 +372,14 @@ public final class ScriptObjectMirror extends JSObject implements Bindings {
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Object[] wrapArray(final Object[] args, final ScriptObject homeGlobal) {
|
/**
|
||||||
|
* Wrap an array of object to script object mirrors if needed.
|
||||||
|
*
|
||||||
|
* @param args array to be unwrapped
|
||||||
|
* @param homeGlobal global to which this object belongs
|
||||||
|
* @return wrapped array
|
||||||
|
*/
|
||||||
|
public static Object[] wrapArray(final Object[] args, final ScriptObject homeGlobal) {
|
||||||
if (args == null || args.length == 0) {
|
if (args == null || args.length == 0) {
|
||||||
return args;
|
return args;
|
||||||
}
|
}
|
||||||
|
@ -378,7 +393,14 @@ public final class ScriptObjectMirror extends JSObject implements Bindings {
|
||||||
return newArgs;
|
return newArgs;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Object[] unwrapArray(final Object[] args, final ScriptObject homeGlobal) {
|
/**
|
||||||
|
* Unwrap an array of script object mirrors if needed.
|
||||||
|
*
|
||||||
|
* @param args array to be unwrapped
|
||||||
|
* @param homeGlobal global to which this object belongs
|
||||||
|
* @return unwrapped array
|
||||||
|
*/
|
||||||
|
public static Object[] unwrapArray(final Object[] args, final ScriptObject homeGlobal) {
|
||||||
if (args == null || args.length == 0) {
|
if (args == null || args.length == 0) {
|
||||||
return args;
|
return args;
|
||||||
}
|
}
|
||||||
|
@ -391,4 +413,13 @@ public final class ScriptObjectMirror extends JSObject implements Bindings {
|
||||||
}
|
}
|
||||||
return newArgs;
|
return newArgs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// package-privates below this.
|
||||||
|
ScriptObject getScriptObject() {
|
||||||
|
return sobj;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Object translateUndefined(Object obj) {
|
||||||
|
return (obj == ScriptRuntime.UNDEFINED)? null : obj;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,6 +48,7 @@ import java.security.PrivilegedAction;
|
||||||
import java.security.ProtectionDomain;
|
import java.security.ProtectionDomain;
|
||||||
import jdk.internal.org.objectweb.asm.ClassReader;
|
import jdk.internal.org.objectweb.asm.ClassReader;
|
||||||
import jdk.internal.org.objectweb.asm.util.CheckClassAdapter;
|
import jdk.internal.org.objectweb.asm.util.CheckClassAdapter;
|
||||||
|
import jdk.nashorn.api.scripting.ScriptObjectMirror;
|
||||||
import jdk.nashorn.internal.codegen.Compiler;
|
import jdk.nashorn.internal.codegen.Compiler;
|
||||||
import jdk.nashorn.internal.codegen.ObjectClassGenerator;
|
import jdk.nashorn.internal.codegen.ObjectClassGenerator;
|
||||||
import jdk.nashorn.internal.ir.FunctionNode;
|
import jdk.nashorn.internal.ir.FunctionNode;
|
||||||
|
@ -518,7 +519,7 @@ public final class Context {
|
||||||
setGlobalTrusted(newGlobal);
|
setGlobalTrusted(newGlobal);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return load(newGlobal, from);
|
return ScriptObjectMirror.wrap(load(newGlobal, from), newGlobal);
|
||||||
} finally {
|
} finally {
|
||||||
setGlobalTrusted(oldGlobal);
|
setGlobalTrusted(oldGlobal);
|
||||||
}
|
}
|
||||||
|
|
55
nashorn/test/script/basic/JDK-8015945.js
Normal file
55
nashorn/test/script/basic/JDK-8015945.js
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
* 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-8015945: loadWithNewGlobal return value has to be properly wrapped
|
||||||
|
*
|
||||||
|
* @test
|
||||||
|
* @option -scripting
|
||||||
|
* @run
|
||||||
|
*/
|
||||||
|
|
||||||
|
var global = loadWithNewGlobal({ name: "<code>",
|
||||||
|
script: <<EOF
|
||||||
|
|
||||||
|
function squares() {
|
||||||
|
var res = new Array(arguments.length);
|
||||||
|
for (var i in arguments) {
|
||||||
|
res[i] = arguments[i]*arguments[i]
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
this;
|
||||||
|
|
||||||
|
EOF
|
||||||
|
})
|
||||||
|
|
||||||
|
print("global an Object? " + (global instanceof Object));
|
||||||
|
var res = global.squares(2, 3, 4, 5);
|
||||||
|
print("global.squares returns Array? " + (res instanceof Array));
|
||||||
|
// still can access array index properties and length
|
||||||
|
print("result length " + res.length);
|
||||||
|
for (var i in res) {
|
||||||
|
print(i + " = " + res[i]);
|
||||||
|
}
|
7
nashorn/test/script/basic/JDK-8015945.js.EXPECTED
Normal file
7
nashorn/test/script/basic/JDK-8015945.js.EXPECTED
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
global an Object? false
|
||||||
|
global.squares returns Array? false
|
||||||
|
result length 4
|
||||||
|
0 = 4
|
||||||
|
1 = 9
|
||||||
|
2 = 16
|
||||||
|
3 = 25
|
Loading…
Add table
Add a link
Reference in a new issue