Chromium Code Reviews| 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 { |