Index: src/stub-cache.cc |
diff --git a/src/stub-cache.cc b/src/stub-cache.cc |
index 8185325018d48c7e19760c4a1630a064d83ce50f..553c6f509710a5736c343a063bd09dc5cf838de9 100644 |
--- a/src/stub-cache.cc |
+++ b/src/stub-cache.cc |
@@ -123,10 +123,13 @@ Handle<Code> StubCache::FindIC(Handle<Name> name, |
Handle<Code> StubCache::FindHandler(Handle<Name> name, |
+ Handle<JSObject> receiver, |
Handle<JSObject> stub_holder, |
Code::Kind kind, |
- Code::StubType type, |
- Code::ExtraICState extra_ic_state) { |
+ Code::StubType type) { |
+ Code::ExtraICState extra_ic_state = Code::ComputeExtraICState( |
+ receiver.is_identical_to(stub_holder) ? Code::OWN_STUB |
+ : Code::PROTOTYPE_STUB); |
ASSERT(type != Code::NORMAL); |
Code::Flags flags = Code::ComputeMonomorphicFlags( |
Code::STUB, extra_ic_state, type, kind); |
@@ -194,7 +197,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 = FindHandler( |
- cache_name, receiver, Code::LOAD_IC, Code::NONEXISTENT); |
+ cache_name, receiver, receiver, Code::LOAD_IC, Code::NONEXISTENT); |
if (!handler.is_null()) return handler; |
LoadStubCompiler compiler(isolate_); |
@@ -218,7 +221,7 @@ Handle<Code> StubCache::ComputeLoadField(Handle<Name> name, |
Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
Handle<Code> stub = FindHandler( |
- name, stub_holder, Code::LOAD_IC, Code::FIELD); |
+ name, receiver, stub_holder, Code::LOAD_IC, Code::FIELD); |
if (!stub.is_null()) return stub; |
LoadStubCompiler compiler(isolate_); |
@@ -237,7 +240,7 @@ Handle<Code> StubCache::ComputeLoadCallback( |
ASSERT(v8::ToCData<Address>(callback->getter()) != 0); |
Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
Handle<Code> stub = FindHandler( |
- name, stub_holder, Code::LOAD_IC, Code::CALLBACKS); |
+ name, receiver, stub_holder, Code::LOAD_IC, Code::CALLBACKS); |
if (!stub.is_null()) return stub; |
LoadStubCompiler compiler(isolate_); |
@@ -254,7 +257,7 @@ Handle<Code> StubCache::ComputeLoadViaGetter(Handle<Name> name, |
Handle<JSFunction> getter) { |
Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
Handle<Code> stub = FindHandler( |
- name, stub_holder, Code::LOAD_IC, Code::CALLBACKS); |
+ name, receiver, stub_holder, Code::LOAD_IC, Code::CALLBACKS); |
if (!stub.is_null()) return stub; |
LoadStubCompiler compiler(isolate_); |
@@ -271,7 +274,7 @@ Handle<Code> StubCache::ComputeLoadConstant(Handle<Name> name, |
Handle<JSFunction> value) { |
Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
Handle<Code> handler = FindHandler( |
- name, stub_holder, Code::LOAD_IC, Code::CONSTANT_FUNCTION); |
+ name, receiver, stub_holder, Code::LOAD_IC, Code::CONSTANT_FUNCTION); |
if (!handler.is_null()) return handler; |
LoadStubCompiler compiler(isolate_); |
@@ -287,7 +290,7 @@ Handle<Code> StubCache::ComputeLoadInterceptor(Handle<Name> name, |
Handle<JSObject> holder) { |
Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
Handle<Code> stub = FindHandler( |
- name, stub_holder, Code::LOAD_IC, Code::INTERCEPTOR); |
+ name, receiver, stub_holder, Code::LOAD_IC, Code::INTERCEPTOR); |
if (!stub.is_null()) return stub; |
LoadStubCompiler compiler(isolate_); |
@@ -334,7 +337,7 @@ Handle<Code> StubCache::ComputeKeyedLoadField(Handle<Name> name, |
Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
Handle<Code> stub = FindHandler( |
- name, stub_holder, Code::KEYED_LOAD_IC, Code::FIELD); |
+ name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::FIELD); |
if (!stub.is_null()) return stub; |
KeyedLoadStubCompiler compiler(isolate_); |
@@ -351,7 +354,8 @@ Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<Name> name, |
Handle<JSFunction> value) { |
Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
Handle<Code> handler = FindHandler( |
- name, stub_holder, Code::KEYED_LOAD_IC, Code::CONSTANT_FUNCTION); |
+ name, receiver, stub_holder, Code::KEYED_LOAD_IC, |
+ Code::CONSTANT_FUNCTION); |
if (!handler.is_null()) return handler; |
KeyedLoadStubCompiler compiler(isolate_); |
@@ -366,7 +370,7 @@ Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<Name> name, |
Handle<JSObject> holder) { |
Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
Handle<Code> stub = FindHandler( |
- name, stub_holder, Code::KEYED_LOAD_IC, Code::INTERCEPTOR); |
+ name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::INTERCEPTOR); |
if (!stub.is_null()) return stub; |
KeyedLoadStubCompiler compiler(isolate_); |
@@ -384,7 +388,7 @@ Handle<Code> StubCache::ComputeKeyedLoadCallback( |
Handle<ExecutableAccessorInfo> callback) { |
Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
Handle<Code> stub = FindHandler( |
- name, stub_holder, Code::KEYED_LOAD_IC, Code::CALLBACKS); |
+ name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::CALLBACKS); |
if (!stub.is_null()) return stub; |
KeyedLoadStubCompiler compiler(isolate_); |