src/jdk/nashorn/api/scripting/ScriptObjectMirror.java
Print this page
*** 40,49 ****
--- 40,50 ----
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,69 ****
--- 61,71 ----
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,109 ****
}
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);
} else if (val instanceof ScriptObjectMirror && ((ScriptObjectMirror)val).isFunction()) {
return ((ScriptObjectMirror)val).call(null, args);
}
throw new NoSuchMethodException("No such function " + ((functionName != null)? functionName : ""));
--- 101,111 ----
}
final Object val = functionName == null? sobj : sobj.get(functionName);
if (val instanceof ScriptFunction) {
final Object[] modArgs = globalChanged? wrapArray(args, oldGlobal) : args;
! 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,139 ****
}
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);
} else if (val instanceof ScriptObjectMirror && ((ScriptObjectMirror)val).isFunction()) {
return ((ScriptObjectMirror)val).newObject(null, args);
}
throw new RuntimeException("not a constructor " + ((functionName != null)? functionName : ""));
--- 131,141 ----
}
final Object val = functionName == null? sobj : sobj.get(functionName);
if (val instanceof ScriptFunction) {
final Object[] modArgs = globalChanged? wrapArray(args, oldGlobal) : args;
! 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,205 ****
@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());
return null;
}
});
}
--- 197,207 ----
@Override
public void setSlot(final int index, final Object value) {
inGlobal(new Callable<Void>() {
@Override public Void call() {
! sobj.set(index, unwrap(value, global), strict);
return null;
}
});
}
*** 207,217 ****
@Override
public void clear() {
inGlobal(new Callable<Object>() {
@Override public Object call() {
! sobj.clear();
return null;
}
});
}
--- 209,219 ----
@Override
public void clear() {
inGlobal(new Callable<Object>() {
@Override public Object call() {
! sobj.clear(strict);
return null;
}
});
}
*** 290,311 ****
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));
}
});
}
@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);
}
--- 292,312 ----
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), 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() {
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,326 ****
@Override
public Object remove(final Object key) {
return inGlobal(new Callable<Object>() {
@Override public Object call() {
! return wrap(sobj.remove(unwrap(key, global)), global);
}
});
}
/**
--- 317,327 ----
@Override
public Object remove(final Object key) {
return inGlobal(new Callable<Object>() {
@Override public Object call() {
! return wrap(sobj.remove(unwrap(key, global), strict), global);
}
});
}
/**
*** 331,341 ****
* @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));
}
});
}
@Override
--- 332,342 ----
* @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), strict);
}
});
}
@Override
*** 635,648 ****
// package-privates below this.
ScriptObjectMirror(final ScriptObject sobj, final ScriptObject global) {
assert sobj != null : "ScriptObjectMirror on null!";
! assert global != null : "null global for ScriptObjectMirror!";
this.sobj = sobj;
this.global = global;
}
// accessors for script engine
ScriptObject getScriptObject() {
return sobj;
--- 636,650 ----
// package-privates below this.
ScriptObjectMirror(final ScriptObject sobj, final ScriptObject global) {
assert sobj != null : "ScriptObjectMirror on null!";
! 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;