Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(539)

Unified Diff: src/ic.cc

Issue 12521007: Cleanup the copying of ICs to the Megamorphic Code Cache (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/ic.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 {
« no previous file with comments | « src/ic.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698