Skip to content

Instantly share code, notes, and snippets.

@vivin
Created December 25, 2015 21:32
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save vivin/cfbb18f21935925555db to your computer and use it in GitHub Desktop.
diff -r 86ed55da74ab -r ccd2e1f96817 src/jdk/nashorn/api/scripting/ScriptObjectMirror.java
--- a/src/jdk/nashorn/api/scripting/ScriptObjectMirror.java Thu Dec 24 16:52:06 2015 +0530
+++ b/src/jdk/nashorn/api/scripting/ScriptObjectMirror.java Fri Dec 25 14:16:10 2015 -0700
@@ -695,7 +695,11 @@
}
final ScriptObject sobj = (ScriptObject)obj;
final Global global = (Global)homeGlobal;
- final ScriptObjectMirror mirror = new ScriptObjectMirror(sobj, global, jsonCompatible);
+ ScriptObjectMirror mirror = Context.getMirrorForScriptObject(sobj);
+ if(mirror == null) {
+ mirror = new ScriptObjectMirror(sobj, global, jsonCompatible);
+ }
+
if (jsonCompatible && sobj.isArray()) {
return new JSONListAdapter(mirror, global);
}
@@ -829,6 +833,8 @@
this.global = global;
this.strict = global.isStrictContext();
this.jsonCompatible = jsonCompatible;
+
+ Context.setMirrorForScriptObject(sobj, this);
}
// accessors for script engine
@@ -918,6 +924,12 @@
if (this.jsonCompatible) {
return this;
}
- return new ScriptObjectMirror(sobj, global, true);
+
+ ScriptObjectMirror mirror = Context.getMirrorForScriptObject(sobj);
+ if(mirror == null || !mirror.jsonCompatible) {
+ mirror = new ScriptObjectMirror(sobj, global, true);
+ }
+
+ return mirror;
}
}
diff -r 86ed55da74ab -r ccd2e1f96817 src/jdk/nashorn/internal/runtime/Context.java
--- a/src/jdk/nashorn/internal/runtime/Context.java Thu Dec 24 16:52:06 2015 +0530
+++ b/src/jdk/nashorn/internal/runtime/Context.java Fri Dec 25 14:16:10 2015 -0700
@@ -56,11 +56,7 @@
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
import java.security.ProtectionDomain;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Consumer;
@@ -279,10 +275,20 @@
// persistent code store
private CodeStore codeStore;
+ private static final WeakHashMap<ScriptObject, ScriptObjectMirror> weakMirrorMap = new WeakHashMap<>();
+
// A factory for linking global properties as constant method handles. It is created when the first Global
// is created, and invalidated forever once the second global is created.
private final AtomicReference<GlobalConstants> globalConstantsRef = new AtomicReference<>();
+ public static ScriptObjectMirror getMirrorForScriptObject(ScriptObject sobj) {
+ return weakMirrorMap.get(sobj);
+ }
+
+ public static void setMirrorForScriptObject(ScriptObject sobj, ScriptObjectMirror mirror) {
+ weakMirrorMap.put(sobj, mirror);
+ }
+
/**
* Get the current global scope
* @return the current global scope
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment