21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package jdk.nashorn.api.scripting; 27 28 import java.util.AbstractMap; 29 import java.util.ArrayList; 30 import java.util.Collection; 31 import java.util.Collections; 32 import java.util.HashSet; 33 import java.util.Iterator; 34 import java.util.List; 35 import java.util.Map; 36 import java.util.Set; 37 import java.util.concurrent.Callable; 38 import jdk.nashorn.internal.runtime.Context; 39 import jdk.nashorn.internal.runtime.ScriptFunction; 40 import jdk.nashorn.internal.runtime.ScriptObject; 41 import netscape.javascript.JSObject; 42 43 /** 44 * Mirror object that wraps a given ScriptObject instance. User can 45 * access ScriptObject via the java.util.Map interface. 46 */ 47 final class ScriptObjectMirror extends JSObject implements Map<Object, Object> { 48 private final ScriptObject sobj; 49 private final ScriptObject global; 50 51 ScriptObjectMirror(final ScriptObject sobj, final ScriptObject global) { 52 this.sobj = sobj; 53 this.global = global; 54 } 55 56 @Override 57 public boolean equals(final Object other) { 58 if (other instanceof ScriptObjectMirror) { 59 return sobj.equals(((ScriptObjectMirror)other).sobj); 60 } 61 62 return false; 63 } 64 65 @Override 66 public int hashCode() { 67 return sobj.hashCode(); 68 } 69 70 private <V> V inGlobal(final Callable<V> callable) { 71 final ScriptObject oldGlobal = Context.getGlobal(); 72 final boolean globalChanged = (oldGlobal != global); 73 if (globalChanged) { 74 NashornScriptEngine.setNashornGlobal(global); 75 } 76 try { 77 return callable.call(); 78 } catch (final RuntimeException e) { 79 throw e; 80 } catch (final Exception e) { 81 throw new AssertionError("Cannot happen", e); 82 } finally { 83 if (globalChanged) { 84 NashornScriptEngine.setNashornGlobal(oldGlobal); 85 } 86 } 87 } 88 89 // JSObject methods | 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package jdk.nashorn.api.scripting; 27 28 import java.util.AbstractMap; 29 import java.util.ArrayList; 30 import java.util.Collection; 31 import java.util.Collections; 32 import java.util.HashSet; 33 import java.util.Iterator; 34 import java.util.List; 35 import java.util.Map; 36 import java.util.Set; 37 import java.util.concurrent.Callable; 38 import jdk.nashorn.internal.runtime.Context; 39 import jdk.nashorn.internal.runtime.ScriptFunction; 40 import jdk.nashorn.internal.runtime.ScriptObject; 41 import jdk.nashorn.internal.runtime.ScriptRuntime; 42 import netscape.javascript.JSObject; 43 44 /** 45 * Mirror object that wraps a given ScriptObject instance. User can 46 * access ScriptObject via the java.util.Map interface. 47 */ 48 final class ScriptObjectMirror extends JSObject implements Map<Object, Object> { 49 private final ScriptObject sobj; 50 private final ScriptObject global; 51 52 ScriptObjectMirror(final ScriptObject sobj, final ScriptObject global) { 53 this.sobj = sobj; 54 this.global = global; 55 } 56 57 @Override 58 public boolean equals(final Object other) { 59 if (other instanceof ScriptObjectMirror) { 60 return sobj.equals(((ScriptObjectMirror)other).sobj); 61 } 62 63 return false; 64 } 65 66 @Override 67 public int hashCode() { 68 return sobj.hashCode(); 69 } 70 71 @Override 72 public String toString() { 73 return inGlobal(new Callable<String>() { 74 @Override 75 public String call() { 76 return ScriptRuntime.safeToString(sobj); 77 } 78 }); 79 } 80 81 private <V> V inGlobal(final Callable<V> callable) { 82 final ScriptObject oldGlobal = Context.getGlobal(); 83 final boolean globalChanged = (oldGlobal != global); 84 if (globalChanged) { 85 NashornScriptEngine.setNashornGlobal(global); 86 } 87 try { 88 return callable.call(); 89 } catch (final RuntimeException e) { 90 throw e; 91 } catch (final Exception e) { 92 throw new AssertionError("Cannot happen", e); 93 } finally { 94 if (globalChanged) { 95 NashornScriptEngine.setNashornGlobal(oldGlobal); 96 } 97 } 98 } 99 100 // JSObject methods |