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