Index: src/ic/ic.cc |
diff --git a/src/ic/ic.cc b/src/ic/ic.cc |
index ebf4bda33a0a55c98890562098ef9e544a04a759..c5835e4f54e666f059523371bb688b354a0f1bcd 100644 |
--- a/src/ic/ic.cc |
+++ b/src/ic/ic.cc |
@@ -1207,6 +1207,7 @@ Handle<Code> LoadIC::CompileHandler(LookupIterator* lookup, |
break; |
} |
if (!holder->HasFastProperties()) break; |
+ if (info->is_sloppy() && !receiver->IsJSReceiver()) break; |
NamedLoadHandlerCompiler compiler(isolate(), map, holder, |
cache_holder); |
return compiler.CompileLoadCallback(lookup->name(), info); |
@@ -1756,6 +1757,7 @@ Handle<Code> StoreIC::CompileHandler(LookupIterator* lookup, |
TRACE_GENERIC_IC(isolate(), "StoreIC", "incompatible receiver type"); |
break; |
} |
+ if (info->is_sloppy() && !receiver->IsJSReceiver()) break; |
NamedStoreHandlerCompiler compiler(isolate(), receiver_map(), holder); |
return compiler.CompileStoreCallback(receiver, lookup->name(), info, |
language_mode()); |
@@ -2798,12 +2800,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); |
@@ -2829,11 +2836,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); |