Chromium Code Reviews| Index: src/ic/ic.cc |
| diff --git a/src/ic/ic.cc b/src/ic/ic.cc |
| index bd5338a694e34e563269d2a1072eec6544471420..27e9f442932f743ade45dbd8d611b4c2d2615362 100644 |
| --- a/src/ic/ic.cc |
| +++ b/src/ic/ic.cc |
| @@ -1024,6 +1024,7 @@ Handle<Code> LoadIC::CompileHandler(LookupIterator* lookup, |
| bool receiver_is_holder = receiver.is_identical_to(holder); |
| switch (lookup->state()) { |
| case LookupIterator::INTERCEPTOR: { |
| + if (!receiver->IsJSReceiver()) break; |
|
Toon Verwaest
2016/05/11 14:19:36
This shouldn't be necessary given your change belo
|
| DCHECK(!holder->GetNamedInterceptor()->getter()->IsUndefined()); |
| TRACE_HANDLER_STATS(isolate(), LoadIC_LoadInterceptor); |
| NamedLoadHandlerCompiler compiler(isolate(), map, holder, cache_holder); |
| @@ -1551,6 +1552,7 @@ Handle<Code> StoreIC::CompileHandler(LookupIterator* lookup, |
| } |
| case LookupIterator::INTERCEPTOR: { |
| + DCHECK(receiver->IsJSReceiver()); |
| DCHECK(!holder->GetNamedInterceptor()->setter()->IsUndefined()); |
| TRACE_HANDLER_STATS(isolate(), StoreIC_StoreInterceptorStub); |
| StoreInterceptorStub stub(isolate()); |
| @@ -2615,12 +2617,17 @@ RUNTIME_FUNCTION(Runtime_LoadPropertyWithInterceptorOnly) { |
| DCHECK(args.length() == NamedLoadHandlerCompiler::kInterceptorArgsLength); |
| Handle<Name> name = |
| args.at<Name>(NamedLoadHandlerCompiler::kInterceptorArgsNameIndex); |
| - Handle<JSObject> receiver = |
| - args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex); |
| + Handle<Object> receiver = |
| + args.at<Object>(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex); |
| Handle<JSObject> holder = |
| args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex); |
| HandleScope scope(isolate); |
| + if (!receiver->IsJSReceiver()) { |
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| + isolate, receiver, Object::ConvertReceiver(isolate, receiver)); |
| + } |
| + |
| InterceptorInfo* interceptor = holder->GetNamedInterceptor(); |
| PropertyCallbackArguments arguments(isolate, interceptor->data(), *receiver, |
| *holder, Object::DONT_THROW); |
| @@ -2646,11 +2653,16 @@ RUNTIME_FUNCTION(Runtime_LoadPropertyWithInterceptor) { |
| DCHECK(args.length() == NamedLoadHandlerCompiler::kInterceptorArgsLength); |
| Handle<Name> name = |
| args.at<Name>(NamedLoadHandlerCompiler::kInterceptorArgsNameIndex); |
| - Handle<JSObject> receiver = |
| - args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex); |
| + Handle<Object> receiver = |
| + args.at<Object>(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex); |
| Handle<JSObject> holder = |
| args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex); |
| + if (!receiver->IsJSReceiver()) { |
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| + isolate, receiver, Object::ConvertReceiver(isolate, receiver)); |
| + } |
| + |
| InterceptorInfo* interceptor = holder->GetNamedInterceptor(); |
| PropertyCallbackArguments arguments(isolate, interceptor->data(), *receiver, |
| *holder, Object::DONT_THROW); |