src/jdk/nashorn/api/scripting/ScriptObjectMirror.java
Print this page
@@ -40,10 +40,11 @@
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Callable;
import javax.script.Bindings;
import jdk.nashorn.internal.runtime.Context;
+import jdk.nashorn.internal.runtime.GlobalObject;
import jdk.nashorn.internal.runtime.ScriptFunction;
import jdk.nashorn.internal.runtime.ScriptObject;
import jdk.nashorn.internal.runtime.ScriptRuntime;
/**
@@ -60,10 +61,11 @@
private static final AccessControlContext GET_CONTEXT_ACC_CTXT = getContextAccCtxt();
private final ScriptObject sobj;
private final ScriptObject global;
+ private final boolean strict;
@Override
public boolean equals(final Object other) {
if (other instanceof ScriptObjectMirror) {
return sobj.equals(((ScriptObjectMirror)other).sobj);
@@ -99,11 +101,11 @@
}
final Object val = functionName == null? sobj : sobj.get(functionName);
if (val instanceof ScriptFunction) {
final Object[] modArgs = globalChanged? wrapArray(args, oldGlobal) : args;
- return wrap(ScriptRuntime.checkAndApply((ScriptFunction)val, sobj, unwrapArray(modArgs, global)), global);
+ return wrap(ScriptRuntime.apply((ScriptFunction)val, sobj, unwrapArray(modArgs, global)), global);
} else if (val instanceof ScriptObjectMirror && ((ScriptObjectMirror)val).isFunction()) {
return ((ScriptObjectMirror)val).call(null, args);
}
throw new NoSuchMethodException("No such function " + ((functionName != null)? functionName : ""));
@@ -129,11 +131,11 @@
}
final Object val = functionName == null? sobj : sobj.get(functionName);
if (val instanceof ScriptFunction) {
final Object[] modArgs = globalChanged? wrapArray(args, oldGlobal) : args;
- return wrap(ScriptRuntime.checkAndConstruct((ScriptFunction)val, unwrapArray(modArgs, global)), global);
+ return wrap(ScriptRuntime.construct((ScriptFunction)val, unwrapArray(modArgs, global)), global);
} else if (val instanceof ScriptObjectMirror && ((ScriptObjectMirror)val).isFunction()) {
return ((ScriptObjectMirror)val).newObject(null, args);
}
throw new RuntimeException("not a constructor " + ((functionName != null)? functionName : ""));
@@ -195,11 +197,11 @@
@Override
public void setSlot(final int index, final Object value) {
inGlobal(new Callable<Void>() {
@Override public Void call() {
- sobj.set(index, unwrap(value, global), global.isStrictContext());
+ sobj.set(index, unwrap(value, global), strict);
return null;
}
});
}
@@ -207,11 +209,11 @@
@Override
public void clear() {
inGlobal(new Callable<Object>() {
@Override public Object call() {
- sobj.clear();
+ sobj.clear(strict);
return null;
}
});
}
@@ -290,22 +292,21 @@
final ScriptObject oldGlobal = Context.getGlobal();
final boolean globalChanged = (oldGlobal != global);
return inGlobal(new Callable<Object>() {
@Override public Object call() {
final Object modValue = globalChanged? wrap(value, oldGlobal) : value;
- return translateUndefined(wrap(sobj.put(key, unwrap(modValue, global)), global));
+ return translateUndefined(wrap(sobj.put(key, unwrap(modValue, global), strict), global));
}
});
}
@Override
public void putAll(final Map<? extends String, ? extends Object> map) {
final ScriptObject oldGlobal = Context.getGlobal();
final boolean globalChanged = (oldGlobal != global);
inGlobal(new Callable<Object>() {
@Override public Object call() {
- final boolean strict = global.isStrictContext();
for (final Map.Entry<? extends String, ? extends Object> entry : map.entrySet()) {
final Object value = entry.getValue();
final Object modValue = globalChanged? wrap(value, oldGlobal) : value;
sobj.set(entry.getKey(), unwrap(modValue, global), strict);
}
@@ -316,11 +317,11 @@
@Override
public Object remove(final Object key) {
return inGlobal(new Callable<Object>() {
@Override public Object call() {
- return wrap(sobj.remove(unwrap(key, global)), global);
+ return wrap(sobj.remove(unwrap(key, global), strict), global);
}
});
}
/**
@@ -331,11 +332,11 @@
* @return if the delete was successful or not
*/
public boolean delete(final Object key) {
return inGlobal(new Callable<Boolean>() {
@Override public Boolean call() {
- return sobj.delete(unwrap(key, global));
+ return sobj.delete(unwrap(key, global), strict);
}
});
}
@Override
@@ -635,14 +636,15 @@
// package-privates below this.
ScriptObjectMirror(final ScriptObject sobj, final ScriptObject global) {
assert sobj != null : "ScriptObjectMirror on null!";
- assert global != null : "null global for ScriptObjectMirror!";
+ assert global instanceof GlobalObject : "global is not a GlobalObject";
this.sobj = sobj;
this.global = global;
+ this.strict = ((GlobalObject)global).isStrictContext();
}
// accessors for script engine
ScriptObject getScriptObject() {
return sobj;