Cleanup the copying of ICs to the Megamorphic Code Cache
authorverwaest@chromium.org <verwaest@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Mon, 11 Mar 2013 15:11:39 +0000 (15:11 +0000)
committerverwaest@chromium.org <verwaest@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Mon, 11 Mar 2013 15:11:39 +0000 (15:11 +0000)
Review URL: https://chromiumcodereview.appspot.com/12521007

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@13907 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/ic.cc
src/ic.h

index f69d79a..da2211b 100644 (file)
--- a/src/ic.cc
+++ b/src/ic.cc
@@ -1021,6 +1021,20 @@ void KeyedLoadIC::UpdateMonomorphicIC(Handle<JSObject> receiver,
 }
 
 
+void IC::CopyICToMegamorphicCache(Handle<String> name) {
+  MapHandleList receiver_maps;
+  CodeHandleList handlers;
+  {
+    AssertNoAllocation no_gc;
+    target()->FindAllMaps(&receiver_maps);
+    target()->FindAllCode(&handlers, receiver_maps.length());
+  }
+  for (int i = 0; i < receiver_maps.length(); i++) {
+    UpdateMegamorphicCache(*receiver_maps.at(i), *name, *handlers.at(i));
+  }
+}
+
+
 // Since GC may have been invoked, by the time PatchCache is called, |state| is
 // not necessarily equal to target()->state().
 void IC::PatchCache(State state,
@@ -1043,28 +1057,17 @@ void IC::PatchCache(State state,
           }
         }
         if (target()->type() != Code::NORMAL) {
-          // We are transitioning from monomorphic to megamorphic case. Place
-          // the stub compiled for the receiver into stub cache.
-          Map* map;
-          Code* handler;
-          {
-            AssertNoAllocation no_gc;
-            map = target()->FindFirstMap();
+          if (target()->is_load_stub()) {
+            CopyICToMegamorphicCache(name);
+          } else {
+            Code* handler = target();
+            Map* map = handler->FindFirstMap();
             if (map != NULL) {
-              if (target()->is_load_stub()) {
-                handler = target()->FindFirstCode();
-              } else {
-                handler = target();
-              }
-            } else {
-              // Avoid compiler warnings.
-              handler = NULL;
+              UpdateMegamorphicCache(map, *name, handler);
             }
           }
-          if (handler != NULL) {
-            UpdateMegamorphicCache(map, *name, handler);
-          }
         }
+
         UpdateMegamorphicCache(receiver->map(), *name, *code);
         set_target((strict_mode == kStrictMode)
                      ? *megamorphic_stub_strict()
@@ -1080,16 +1083,7 @@ void IC::PatchCache(State state,
         if (UpdatePolymorphicIC(state, strict_mode, receiver, name, code)) {
           break;
         }
-        MapHandleList receiver_maps;
-        CodeHandleList handlers;
-        {
-          AssertNoAllocation no_gc;
-          target()->FindAllMaps(&receiver_maps);
-          target()->FindAllCode(&handlers, receiver_maps.length());
-        }
-        for (int i = 0; i < receiver_maps.length(); i++) {
-          UpdateMegamorphicCache(*receiver_maps.at(i), *name, *handlers.at(i));
-        }
+        CopyICToMegamorphicCache(name);
         UpdateMegamorphicCache(receiver->map(), *name, *code);
         set_target(*megamorphic_stub());
       } else {
index f5f822b..b225955 100644 (file)
--- a/src/ic.h
+++ b/src/ic.h
@@ -175,6 +175,7 @@ class IC {
                            Handle<JSObject> receiver,
                            Handle<String> name,
                            Handle<Code> code);
+  void CopyICToMegamorphicCache(Handle<String> name);
   void PatchCache(State state,
                   StrictModeFlag strict_mode,
                   Handle<JSObject> receiver,