| 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_);
|
|
|