Revert of Debugger: use a Map to cache mirrors. (patchset #1 id:1 of https://coderevi...
authoryangguo <yangguo@chromium.org>
Thu, 13 Aug 2015 12:09:30 +0000 (05:09 -0700)
committerCommit bot <commit-bot@chromium.org>
Thu, 13 Aug 2015 12:09:42 +0000 (12:09 +0000)
Reason for revert:
Several nosnap and custom snapshot failures.

Original issue's description:
> Debugger: use a Map to cache mirrors.
>
> This makes mirror cache lookup O(1) instead of O(n).
> The downside is that the lookup via handle is O(n). This
> is fine because handles are only used in the JSON api,
> which is not used by Chrome and on death row.
>
> Committed: https://crrev.com/890b1dfca84d9dfecdcfc56517ef541076c6eb1d
> Cr-Commit-Position: refs/heads/master@{#30150}

TBR=bmeurer@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true

Review URL: https://codereview.chromium.org/1292023002

Cr-Commit-Position: refs/heads/master@{#30153}

src/bootstrapper.cc
src/debug/mirrors.js

index 1952e02..5fee783 100644 (file)
@@ -1802,9 +1802,6 @@ Data* SetBuiltinTypedArray(Isolate* isolate, Handle<JSBuiltinsObject> builtins,
 
 
 void Genesis::InitializeBuiltinTypedArrays() {
-  // The serializer cannot serialize typed arrays. Reset those typed arrays
-  // for each new context.
-  DCHECK(!isolate()->serializer_enabled());
   Handle<JSBuiltinsObject> builtins(native_context()->builtins());
   {  // Initially seed the per-context random number generator using the
     // per-isolate random number generator.
@@ -3233,21 +3230,25 @@ Genesis::Genesis(Isolate* isolate,
   // Install experimental and extra natives. Do not include them into the
   // snapshot as we should be able to turn them off at runtime. Re-installing
   // them after they have already been deserialized would also fail.
-  if (!isolate->serializer_enabled() && context_type != THIN_CONTEXT) {
-    InitializeExperimentalGlobal();
-    InitializeBuiltinTypedArrays();
-    if (context_type == FULL_CONTEXT) {
+  if (context_type == FULL_CONTEXT) {
+    if (!isolate->serializer_enabled()) {
+      InitializeExperimentalGlobal();
       if (!InstallExperimentalNatives()) return;
       if (!InstallExtraNatives()) return;
       // By now the utils object is useless and can be removed.
       native_context()->set_natives_utils_object(
           isolate->heap()->undefined_value());
-      InitializeBuiltinTypedArrays();
-    } else {
-      DCHECK_EQ(DEBUG_CONTEXT, context_type);
-      if (!InstallDebuggerNatives()) return;
     }
+
+    // The serializer cannot serialize typed arrays. Reset those typed arrays
+    // for each new context.
+    InitializeBuiltinTypedArrays();
+  } else if (context_type == DEBUG_CONTEXT) {
+    DCHECK(!isolate->serializer_enabled());
+    InitializeExperimentalGlobal();
+    if (!InstallDebuggerNatives()) return;
   }
+
   result_ = native_context();
 }
 
index 31387ab..85ff2b2 100644 (file)
@@ -11,7 +11,6 @@
 var GlobalArray = global.Array;
 var IsNaN = global.isNaN;
 var JSONStringify = global.JSON.stringify;
-var GlobalMap = global.Map;
 var MathMin = global.Math.min;
 
 // ----------------------------------------------------------------------------
@@ -74,12 +73,12 @@ var next_handle_ = 0;
 var next_transient_handle_ = -1;
 
 // Mirror cache.
-var mirror_cache_ = new GlobalMap();
+var mirror_cache_ = [];
 var mirror_cache_enabled_ = true;
 
 
 function MirrorCacheIsEmpty() {
-  return mirror_cache_.size === 0;
+  return next_handle_ == 0 && mirror_cache_.length == 0;
 }
 
 
@@ -91,7 +90,7 @@ function ToggleMirrorCache(value) {
 
 function ClearMirrorCache(value) {
   next_handle_ = 0;
-  mirror_cache_.clear();
+  mirror_cache_ = [];
 }
 
 
@@ -121,7 +120,17 @@ function MakeMirror(value, opt_transient) {
 
   // Look for non transient mirrors in the mirror cache.
   if (!opt_transient && mirror_cache_enabled_) {
-    if (mirror_cache_.has(value)) return mirror_cache_.get(value);
+    for (var id in mirror_cache_) {
+      mirror = mirror_cache_[id];
+      if (mirror.value() === value) {
+        return mirror;
+      }
+      // Special check for NaN as NaN == NaN is false.
+      if (mirror.isNumber() && IsNaN(mirror.value()) &&
+          typeof value == 'number' && IsNaN(value)) {
+        return mirror;
+      }
+    }
   }
 
   if (IS_UNDEFINED(value)) {
@@ -162,7 +171,7 @@ function MakeMirror(value, opt_transient) {
     mirror = new ObjectMirror(value, MirrorType.OBJECT_TYPE, opt_transient);
   }
 
-  if (mirror_cache_enabled_) mirror_cache_.set(value, mirror);
+  if (mirror_cache_enabled_) mirror_cache_[mirror.handle()] = mirror;
   return mirror;
 }
 
@@ -178,10 +187,7 @@ function LookupMirror(handle) {
   if (!mirror_cache_enabled_) {
     throw MakeError(kDebugger, "Mirror cache is disabled");
   }
-  for (var value of mirror_cache_.values()) {
-    if (value.handle() == handle) return value;
-  }
-  return UNDEFINED;
+  return mirror_cache_[handle];
 }