Index: src/ic.cc |
diff --git a/src/ic.cc b/src/ic.cc |
index 866fcce0c690ded60456f6c5afb3ad8660924a73..d673597b54f75625d4837779ae8f76df25c0be8b 100644 |
--- a/src/ic.cc |
+++ b/src/ic.cc |
@@ -1010,6 +1010,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, |
@@ -1032,28 +1046,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, target()); |
Jakob Kummerow
2013/03/07 11:26:40
You can s/target()/handler/ here.
Toon Verwaest
2013/03/11 15:11:19
Done.
|
} |
} |
- if (handler != NULL) { |
- UpdateMegamorphicCache(map, *name, handler); |
- } |
} |
+ |
UpdateMegamorphicCache(receiver->map(), *name, *code); |
set_target((strict_mode == kStrictMode) |
? *megamorphic_stub_strict() |
@@ -1069,16 +1072,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 { |