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