This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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