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;