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

Unified Diff: src/stub-cache.cc

Issue 25548009: Centralize handler caching and probing in ic.cc. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Undo moving fallback IC handling Created 7 years, 2 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/stub-cache.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/stub-cache.cc
diff --git a/src/stub-cache.cc b/src/stub-cache.cc
index 4eb6241d87fd0225ef73274bdd469f60f97d98b1..4f757fc2bb753b36812a6881d2e77d4676b4ce01 100644
--- a/src/stub-cache.cc
+++ b/src/stub-cache.cc
@@ -119,24 +119,15 @@ Handle<Code> StubCache::FindIC(Handle<Name> name,
}
-Handle<Code> StubCache::FindLoadHandler(Handle<Name> name,
- Handle<JSObject> receiver,
- Code::Kind kind) {
- Code::Flags flags = Code::ComputeMonomorphicFlags(
- Code::HANDLER, Code::kNoExtraICState, Code::NORMAL, kind);
- Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags),
- isolate_);
- if (probe->IsCode()) return Handle<Code>::cast(probe);
- return Handle<Code>::null();
-}
-
-
-Handle<Code> StubCache::FindStoreHandler(Handle<Name> name,
- Handle<JSObject> receiver,
- Code::Kind kind,
- StrictModeFlag strict_mode) {
- Code::ExtraICState extra_ic_state = Code::ComputeExtraICState(
- STANDARD_STORE, strict_mode);
+Handle<Code> StubCache::FindHandler(Handle<Name> name,
+ Handle<JSObject> receiver,
+ Code::Kind kind,
+ StrictModeFlag strict_mode) {
+ Code::ExtraICState extra_ic_state = Code::kNoExtraICState;
+ if (kind == Code::STORE_IC || kind == Code::KEYED_STORE_IC) {
+ extra_ic_state = Code::ComputeExtraICState(
+ STANDARD_STORE, strict_mode);
+ }
Code::Flags flags = Code::ComputeMonomorphicFlags(
Code::HANDLER, extra_ic_state, Code::NORMAL, kind);
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags),
@@ -200,7 +191,7 @@ Handle<Code> StubCache::ComputeLoadNonexistent(Handle<Name> name,
// Compile the stub that is either shared for all names or
// name specific if there are global objects involved.
- Handle<Code> handler = FindLoadHandler(cache_name, receiver, Code::LOAD_IC);
+ Handle<Code> handler = FindHandler(cache_name, receiver, Code::LOAD_IC);
if (!handler.is_null()) return handler;
LoadStubCompiler compiler(isolate_);
@@ -223,14 +214,9 @@ Handle<Code> StubCache::ComputeLoadField(Handle<Name> name,
return stub.GetCode(isolate());
}
- Handle<Code> stub = FindLoadHandler(name, receiver, Code::LOAD_IC);
- if (!stub.is_null()) return stub;
-
LoadStubCompiler compiler(isolate_);
- Handle<Code> handler =
- compiler.CompileLoadField(receiver, holder, name, field, representation);
- HeapObject::UpdateMapCodeCache(receiver, name, handler);
- return handler;
+ return compiler.CompileLoadField(
+ receiver, holder, name, field, representation);
}
@@ -240,14 +226,8 @@ Handle<Code> StubCache::ComputeLoadCallback(
Handle<JSObject> holder,
Handle<ExecutableAccessorInfo> callback) {
ASSERT(v8::ToCData<Address>(callback->getter()) != 0);
- Handle<Code> stub = FindLoadHandler(name, receiver, Code::LOAD_IC);
- if (!stub.is_null()) return stub;
-
LoadStubCompiler compiler(isolate_);
- Handle<Code> handler =
- compiler.CompileLoadCallback(receiver, holder, name, callback);
- HeapObject::UpdateMapCodeCache(receiver, name, handler);
- return handler;
+ return compiler.CompileLoadCallback(receiver, holder, name, callback);
}
@@ -256,14 +236,9 @@ Handle<Code> StubCache::ComputeLoadCallback(
Handle<JSObject> receiver,
Handle<JSObject> holder,
const CallOptimization& call_optimization) {
- Handle<Code> stub = FindLoadHandler(name, receiver, Code::LOAD_IC);
- if (!stub.is_null()) return stub;
-
LoadStubCompiler compiler(isolate_);
- Handle<Code> handler =
- compiler.CompileLoadCallback(receiver, holder, name, call_optimization);
- HeapObject::UpdateMapCodeCache(receiver, name, handler);
- return handler;
+ return compiler.CompileLoadCallback(
+ receiver, holder, name, call_optimization);
}
@@ -271,14 +246,8 @@ Handle<Code> StubCache::ComputeLoadViaGetter(Handle<Name> name,
Handle<JSObject> receiver,
Handle<JSObject> holder,
Handle<JSFunction> getter) {
- Handle<Code> stub = FindLoadHandler(name, receiver, Code::LOAD_IC);
- if (!stub.is_null()) return stub;
-
LoadStubCompiler compiler(isolate_);
- Handle<Code> handler =
- compiler.CompileLoadViaGetter(receiver, holder, name, getter);
- HeapObject::UpdateMapCodeCache(receiver, name, handler);
- return handler;
+ return compiler.CompileLoadViaGetter(receiver, holder, name, getter);
}
@@ -286,28 +255,16 @@ Handle<Code> StubCache::ComputeLoadConstant(Handle<Name> name,
Handle<JSObject> receiver,
Handle<JSObject> holder,
Handle<Object> value) {
- Handle<Code> handler = FindLoadHandler(name, receiver, Code::LOAD_IC);
- if (!handler.is_null()) return handler;
-
LoadStubCompiler compiler(isolate_);
- handler = compiler.CompileLoadConstant(receiver, holder, name, value);
- HeapObject::UpdateMapCodeCache(receiver, name, handler);
-
- return handler;
+ return compiler.CompileLoadConstant(receiver, holder, name, value);
}
Handle<Code> StubCache::ComputeLoadInterceptor(Handle<Name> name,
Handle<JSObject> receiver,
Handle<JSObject> holder) {
- Handle<Code> stub = FindLoadHandler(name, receiver, Code::LOAD_IC);
- if (!stub.is_null()) return stub;
-
LoadStubCompiler compiler(isolate_);
- Handle<Code> handler =
- compiler.CompileLoadInterceptor(receiver, holder, name);
- HeapObject::UpdateMapCodeCache(receiver, name, handler);
- return handler;
+ return compiler.CompileLoadInterceptor(receiver, holder, name);
}
@@ -346,14 +303,9 @@ Handle<Code> StubCache::ComputeKeyedLoadField(Handle<Name> name,
return stub.GetCode(isolate());
}
- Handle<Code> stub = FindLoadHandler(name, receiver, Code::KEYED_LOAD_IC);
- if (!stub.is_null()) return stub;
-
KeyedLoadStubCompiler compiler(isolate_);
- Handle<Code> handler =
- compiler.CompileLoadField(receiver, holder, name, field, representation);
- HeapObject::UpdateMapCodeCache(receiver, name, handler);
- return handler;
+ return compiler.CompileLoadField(
+ receiver, holder, name, field, representation);
}
@@ -361,27 +313,17 @@ Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<Name> name,
Handle<JSObject> receiver,
Handle<JSObject> holder,
Handle<Object> value) {
- Handle<Code> handler = FindLoadHandler(name, receiver, Code::KEYED_LOAD_IC);
- if (!handler.is_null()) return handler;
-
KeyedLoadStubCompiler compiler(isolate_);
- handler = compiler.CompileLoadConstant(receiver, holder, name, value);
- HeapObject::UpdateMapCodeCache(receiver, name, handler);
- return handler;
+ return compiler.CompileLoadConstant(
+ receiver, holder, name, value);
}
Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<Name> name,
Handle<JSObject> receiver,
Handle<JSObject> holder) {
- Handle<Code> stub = FindLoadHandler(name, receiver, Code::KEYED_LOAD_IC);
- if (!stub.is_null()) return stub;
-
KeyedLoadStubCompiler compiler(isolate_);
- Handle<Code> handler =
- compiler.CompileLoadInterceptor(receiver, holder, name);
- HeapObject::UpdateMapCodeCache(receiver, name, handler);
- return handler;
+ return compiler.CompileLoadInterceptor(receiver, holder, name);
}
@@ -390,14 +332,8 @@ Handle<Code> StubCache::ComputeKeyedLoadCallback(
Handle<JSObject> receiver,
Handle<JSObject> holder,
Handle<ExecutableAccessorInfo> callback) {
- Handle<Code> stub = FindLoadHandler(name, receiver, Code::KEYED_LOAD_IC);
- if (!stub.is_null()) return stub;
-
KeyedLoadStubCompiler compiler(isolate_);
- Handle<Code> handler =
- compiler.CompileLoadCallback(receiver, holder, name, callback);
- HeapObject::UpdateMapCodeCache(receiver, name, handler);
- return handler;
+ return compiler.CompileLoadCallback(receiver, holder, name, callback);
}
@@ -406,14 +342,9 @@ Handle<Code> StubCache::ComputeKeyedLoadCallback(
Handle<JSObject> receiver,
Handle<JSObject> holder,
const CallOptimization& call_optimization) {
- Handle<Code> stub = FindLoadHandler(name, receiver, Code::KEYED_LOAD_IC);
- if (!stub.is_null()) return stub;
-
KeyedLoadStubCompiler compiler(isolate_);
- Handle<Code> handler =
- compiler.CompileLoadCallback(receiver, holder, name, call_optimization);
- HeapObject::UpdateMapCodeCache(receiver, name, handler);
- return handler;
+ return compiler.CompileLoadCallback(
+ receiver, holder, name, call_optimization);
}
@@ -421,14 +352,8 @@ Handle<Code> StubCache::ComputeStoreField(Handle<Name> name,
Handle<JSObject> receiver,
LookupResult* lookup,
StrictModeFlag strict_mode) {
- Handle<Code> stub = FindStoreHandler(
- name, receiver, Code::STORE_IC, strict_mode);
- if (!stub.is_null()) return stub;
-
StoreStubCompiler compiler(isolate_, strict_mode);
- Handle<Code> handler = compiler.CompileStoreField(receiver, lookup, name);
- HeapObject::UpdateMapCodeCache(receiver, name, handler);
- return handler;
+ return compiler.CompileStoreField(receiver, lookup, name);
}
@@ -437,15 +362,8 @@ Handle<Code> StubCache::ComputeStoreTransition(Handle<Name> name,
LookupResult* lookup,
Handle<Map> transition,
StrictModeFlag strict_mode) {
- Handle<Code> stub = FindStoreHandler(
- name, receiver, Code::STORE_IC, strict_mode);
- if (!stub.is_null()) return stub;
-
StoreStubCompiler compiler(isolate_, strict_mode);
- Handle<Code> handler =
- compiler.CompileStoreTransition(receiver, lookup, transition, name);
- HeapObject::UpdateMapCodeCache(receiver, name, handler);
- return handler;
+ return compiler.CompileStoreTransition(receiver, lookup, transition, name);
}
@@ -537,15 +455,8 @@ Handle<Code> StubCache::ComputeStoreCallback(
Handle<ExecutableAccessorInfo> callback,
StrictModeFlag strict_mode) {
ASSERT(v8::ToCData<Address>(callback->setter()) != 0);
- Handle<Code> stub = FindStoreHandler(
- name, receiver, Code::STORE_IC, strict_mode);
- if (!stub.is_null()) return stub;
-
StoreStubCompiler compiler(isolate_, strict_mode);
- Handle<Code> handler = compiler.CompileStoreCallback(
- receiver, holder, name, callback);
- HeapObject::UpdateMapCodeCache(receiver, name, handler);
- return handler;
+ return compiler.CompileStoreCallback(receiver, holder, name, callback);
}
@@ -555,15 +466,9 @@ Handle<Code> StubCache::ComputeStoreCallback(
Handle<JSObject> holder,
const CallOptimization& call_optimization,
StrictModeFlag strict_mode) {
- Handle<Code> stub = FindStoreHandler(
- name, receiver, Code::STORE_IC, strict_mode);
- if (!stub.is_null()) return stub;
-
StoreStubCompiler compiler(isolate_, strict_mode);
- Handle<Code> handler = compiler.CompileStoreCallback(
+ return compiler.CompileStoreCallback(
receiver, holder, name, call_optimization);
- HeapObject::UpdateMapCodeCache(receiver, name, handler);
- return handler;
}
@@ -572,29 +477,16 @@ Handle<Code> StubCache::ComputeStoreViaSetter(Handle<Name> name,
Handle<JSObject> holder,
Handle<JSFunction> setter,
StrictModeFlag strict_mode) {
- Handle<Code> stub = FindStoreHandler(
- name, receiver, Code::STORE_IC, strict_mode);
- if (!stub.is_null()) return stub;
-
StoreStubCompiler compiler(isolate_, strict_mode);
- Handle<Code> handler = compiler.CompileStoreViaSetter(
- receiver, holder, name, setter);
- HeapObject::UpdateMapCodeCache(receiver, name, handler);
- return handler;
+ return compiler.CompileStoreViaSetter(receiver, holder, name, setter);
}
Handle<Code> StubCache::ComputeStoreInterceptor(Handle<Name> name,
Handle<JSObject> receiver,
StrictModeFlag strict_mode) {
- Handle<Code> stub = FindStoreHandler(
- name, receiver, Code::STORE_IC, strict_mode);
- if (!stub.is_null()) return stub;
-
StoreStubCompiler compiler(isolate_, strict_mode);
- Handle<Code> handler = compiler.CompileStoreInterceptor(receiver, name);
- HeapObject::UpdateMapCodeCache(receiver, name, handler);
- return handler;
+ return compiler.CompileStoreInterceptor(receiver, name);
}
@@ -602,14 +494,8 @@ Handle<Code> StubCache::ComputeKeyedStoreField(Handle<Name> name,
Handle<JSObject> receiver,
LookupResult* lookup,
StrictModeFlag strict_mode) {
- Handle<Code> stub = FindStoreHandler(
- name, receiver, Code::KEYED_STORE_IC, strict_mode);
- if (!stub.is_null()) return stub;
-
KeyedStoreStubCompiler compiler(isolate(), strict_mode, STANDARD_STORE);
- Handle<Code> handler = compiler.CompileStoreField(receiver, lookup, name);
- HeapObject::UpdateMapCodeCache(receiver, name, handler);
- return handler;
+ return compiler.CompileStoreField(receiver, lookup, name);
}
@@ -619,15 +505,8 @@ Handle<Code> StubCache::ComputeKeyedStoreTransition(
LookupResult* lookup,
Handle<Map> transition,
StrictModeFlag strict_mode) {
- Handle<Code> stub = FindStoreHandler(
- name, receiver, Code::KEYED_STORE_IC, strict_mode);
- if (!stub.is_null()) return stub;
-
KeyedStoreStubCompiler compiler(isolate(), strict_mode, STANDARD_STORE);
- Handle<Code> handler =
- compiler.CompileStoreTransition(receiver, lookup, transition, name);
- HeapObject::UpdateMapCodeCache(receiver, name, handler);
- return handler;
+ return compiler.CompileStoreTransition(receiver, lookup, transition, name);
}
« no previous file with comments | « src/stub-cache.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698