Index: src/stub-cache.cc |
diff --git a/src/stub-cache.cc b/src/stub-cache.cc |
index ac5ee55e79963dfdb8fe8eb8347940e76a79351f..bdfb32f46014617441990e60673620c0d186d3d9 100644 |
--- a/src/stub-cache.cc |
+++ b/src/stub-cache.cc |
@@ -272,29 +272,21 @@ Handle<Code> StubCache::ComputeLoadNonexistent(Handle<Name> name, |
Handle<Code> StubCache::ComputeLoadField(Handle<Name> name, |
Handle<JSObject> receiver, |
Handle<JSObject> holder, |
- Code::Kind kind, |
PropertyIndex field, |
Representation representation) { |
if (receiver.is_identical_to(holder)) { |
- if (kind == Code::LOAD_IC) { |
- LoadFieldStub stub(field.is_inobject(holder), |
- field.translate(holder), |
- representation); |
- return stub.GetCode(isolate()); |
- } else { |
- KeyedLoadFieldStub stub(field.is_inobject(holder), |
- field.translate(holder), |
- representation); |
- return stub.GetCode(isolate()); |
- } |
+ LoadFieldStub stub(field.is_inobject(holder), |
+ field.translate(holder), |
+ representation); |
+ return stub.GetCode(isolate()); |
} |
Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
Handle<Code> stub = FindLoadHandler( |
- name, receiver, stub_holder, kind, Code::FIELD); |
+ name, receiver, stub_holder, Code::LOAD_IC, Code::FIELD); |
if (!stub.is_null()) return stub; |
- BaseLoadStubCompiler compiler(isolate_, kind); |
+ LoadStubCompiler compiler(isolate_); |
Handle<Code> handler = |
compiler.CompileLoadField(receiver, holder, name, field, representation); |
JSObject::UpdateMapCodeCache(stub_holder, name, handler); |
@@ -306,15 +298,14 @@ Handle<Code> StubCache::ComputeLoadCallback( |
Handle<Name> name, |
Handle<JSObject> receiver, |
Handle<JSObject> holder, |
- Code::Kind kind, |
Handle<ExecutableAccessorInfo> callback) { |
ASSERT(v8::ToCData<Address>(callback->getter()) != 0); |
Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
Handle<Code> stub = FindLoadHandler( |
- name, receiver, stub_holder, kind, Code::CALLBACKS); |
+ name, receiver, stub_holder, Code::LOAD_IC, Code::CALLBACKS); |
if (!stub.is_null()) return stub; |
- BaseLoadStubCompiler compiler(isolate_, kind); |
+ LoadStubCompiler compiler(isolate_); |
Handle<Code> handler = |
compiler.CompileLoadCallback(receiver, holder, name, callback); |
JSObject::UpdateMapCodeCache(stub_holder, name, handler); |
@@ -326,14 +317,13 @@ Handle<Code> StubCache::ComputeLoadCallback( |
Handle<Name> name, |
Handle<JSObject> receiver, |
Handle<JSObject> holder, |
- Code::Kind kind, |
const CallOptimization& call_optimization) { |
Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
Handle<Code> stub = FindLoadHandler( |
- name, receiver, stub_holder, kind, Code::CALLBACKS); |
+ name, receiver, stub_holder, Code::LOAD_IC, Code::CALLBACKS); |
if (!stub.is_null()) return stub; |
- BaseLoadStubCompiler compiler(isolate_, kind); |
+ LoadStubCompiler compiler(isolate_); |
Handle<Code> handler = |
compiler.CompileLoadCallback(receiver, holder, name, call_optimization); |
JSObject::UpdateMapCodeCache(stub_holder, name, handler); |
@@ -361,30 +351,29 @@ Handle<Code> StubCache::ComputeLoadViaGetter(Handle<Name> name, |
Handle<Code> StubCache::ComputeLoadConstant(Handle<Name> name, |
Handle<JSObject> receiver, |
Handle<JSObject> holder, |
- Code::Kind kind, |
Handle<Object> value) { |
Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
Handle<Code> handler = FindLoadHandler( |
- name, receiver, stub_holder, kind, Code::CONSTANT); |
+ name, receiver, stub_holder, Code::LOAD_IC, Code::CONSTANT); |
if (!handler.is_null()) return handler; |
- BaseLoadStubCompiler compiler(isolate_, kind); |
+ LoadStubCompiler compiler(isolate_); |
handler = compiler.CompileLoadConstant(receiver, holder, name, value); |
JSObject::UpdateMapCodeCache(stub_holder, name, handler); |
+ |
return handler; |
} |
Handle<Code> StubCache::ComputeLoadInterceptor(Handle<Name> name, |
Handle<JSObject> receiver, |
- Handle<JSObject> holder, |
- Code::Kind kind) { |
+ Handle<JSObject> holder) { |
Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
Handle<Code> stub = FindLoadHandler( |
- name, receiver, stub_holder, kind, Code::INTERCEPTOR); |
+ name, receiver, stub_holder, Code::LOAD_IC, Code::INTERCEPTOR); |
if (!stub.is_null()) return stub; |
- BaseLoadStubCompiler compiler(isolate_, kind); |
+ LoadStubCompiler compiler(isolate_); |
Handle<Code> handler = |
compiler.CompileLoadInterceptor(receiver, holder, name); |
JSObject::UpdateMapCodeCache(stub_holder, name, handler); |
@@ -415,6 +404,101 @@ Handle<Code> StubCache::ComputeLoadGlobal(Handle<Name> name, |
} |
+Handle<Code> StubCache::ComputeKeyedLoadField(Handle<Name> name, |
+ Handle<JSObject> receiver, |
+ Handle<JSObject> holder, |
+ PropertyIndex field, |
+ Representation representation) { |
+ if (receiver.is_identical_to(holder)) { |
+ // TODO(titzer): this should use an HObjectAccess |
+ KeyedLoadFieldStub stub(field.is_inobject(holder), |
+ field.translate(holder), |
+ representation); |
+ return stub.GetCode(isolate()); |
+ } |
+ |
+ Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
+ Handle<Code> stub = FindLoadHandler( |
+ name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::FIELD); |
+ if (!stub.is_null()) return stub; |
+ |
+ KeyedLoadStubCompiler compiler(isolate_); |
+ Handle<Code> handler = |
+ compiler.CompileLoadField(receiver, holder, name, field, representation); |
+ JSObject::UpdateMapCodeCache(stub_holder, name, handler); |
+ return handler; |
+} |
+ |
+ |
+Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<Name> name, |
+ Handle<JSObject> receiver, |
+ Handle<JSObject> holder, |
+ Handle<Object> value) { |
+ Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
+ Handle<Code> handler = FindLoadHandler( |
+ name, receiver, stub_holder, Code::KEYED_LOAD_IC, |
+ Code::CONSTANT); |
+ if (!handler.is_null()) return handler; |
+ |
+ KeyedLoadStubCompiler compiler(isolate_); |
+ handler = compiler.CompileLoadConstant(receiver, holder, name, value); |
+ JSObject::UpdateMapCodeCache(stub_holder, name, handler); |
+ return handler; |
+} |
+ |
+ |
+Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<Name> name, |
+ Handle<JSObject> receiver, |
+ Handle<JSObject> holder) { |
+ Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
+ Handle<Code> stub = FindLoadHandler( |
+ name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::INTERCEPTOR); |
+ if (!stub.is_null()) return stub; |
+ |
+ KeyedLoadStubCompiler compiler(isolate_); |
+ Handle<Code> handler = |
+ compiler.CompileLoadInterceptor(receiver, holder, name); |
+ JSObject::UpdateMapCodeCache(stub_holder, name, handler); |
+ return handler; |
+} |
+ |
+ |
+Handle<Code> StubCache::ComputeKeyedLoadCallback( |
+ Handle<Name> name, |
+ Handle<JSObject> receiver, |
+ Handle<JSObject> holder, |
+ Handle<ExecutableAccessorInfo> callback) { |
+ Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
+ Handle<Code> stub = FindLoadHandler( |
+ name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::CALLBACKS); |
+ if (!stub.is_null()) return stub; |
+ |
+ KeyedLoadStubCompiler compiler(isolate_); |
+ Handle<Code> handler = |
+ compiler.CompileLoadCallback(receiver, holder, name, callback); |
+ JSObject::UpdateMapCodeCache(stub_holder, name, handler); |
+ return handler; |
+} |
+ |
+ |
+Handle<Code> StubCache::ComputeKeyedLoadCallback( |
+ Handle<Name> name, |
+ Handle<JSObject> receiver, |
+ Handle<JSObject> holder, |
+ const CallOptimization& call_optimization) { |
+ Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
+ Handle<Code> stub = FindLoadHandler( |
+ name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::CALLBACKS); |
+ if (!stub.is_null()) return stub; |
+ |
+ KeyedLoadStubCompiler compiler(isolate_); |
+ Handle<Code> handler = |
+ compiler.CompileLoadCallback(receiver, holder, name, call_optimization); |
+ JSObject::UpdateMapCodeCache(stub_holder, name, handler); |
+ return handler; |
+} |
+ |
+ |
Handle<Code> StubCache::ComputeStoreField(Handle<Name> name, |
Handle<JSObject> receiver, |
LookupResult* lookup, |
@@ -1873,15 +1957,23 @@ void StubCompiler::TailCallBuiltin(MacroAssembler* masm, Builtins::Name name) { |
} |
-Register* BaseLoadStoreStubCompiler::GetRegisters(Code::Kind kind) { |
- switch (kind) { |
- case Code::LOAD_IC: return LoadStubCompiler::registers(); |
- case Code::STORE_IC: return StoreStubCompiler::registers(); |
- case Code::KEYED_LOAD_IC: return KeyedLoadStubCompiler::registers(); |
- case Code::KEYED_STORE_IC: return KeyedStoreStubCompiler::registers(); |
- default: UNREACHABLE(); |
- } |
- return NULL; |
+void LoadStubCompiler::JitEvent(Handle<Name> name, Handle<Code> code) { |
+ GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
+} |
+ |
+ |
+void KeyedLoadStubCompiler::JitEvent(Handle<Name> name, Handle<Code> code) { |
+ GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
+} |
+ |
+ |
+void StoreStubCompiler::JitEvent(Handle<Name> name, Handle<Code> code) { |
+ GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
+} |
+ |
+ |
+void KeyedStoreStubCompiler::JitEvent(Handle<Name> name, Handle<Code> code) { |
+ GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, *name, *code)); |
} |