| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 4d08b7999ed27c317b41109f381eafb8d25575c3..6a2d345931365042b3622125020c15760ba7d88a 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -409,8 +409,10 @@ MaybeHandle<Object> Object::GetPropertyWithAccessor(Handle<Object> receiver,
|
| ASSERT(!structure->IsForeign());
|
| // api style callbacks.
|
| if (structure->IsAccessorInfo()) {
|
| - Handle<AccessorInfo> accessor_info = Handle<AccessorInfo>::cast(structure);
|
| - if (!accessor_info->IsCompatibleReceiver(*receiver)) {
|
| + Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(structure);
|
| + if (info->HasExpectedReceiverType() &&
|
| + !(receiver->IsHeapObject() &&
|
| + info->IsCompatibleReceiver(HeapObject::cast(*receiver)->map()))) {
|
| Handle<Object> args[2] = { name, receiver };
|
| Handle<Object> error =
|
| isolate->factory()->NewTypeError("incompatible_method_receiver",
|
| @@ -474,8 +476,10 @@ MaybeHandle<Object> Object::SetPropertyWithAccessor(
|
| // Don't call executable accessor setters with non-JSObject receivers.
|
| if (!receiver->IsJSObject()) return value;
|
| // api style callbacks
|
| - ExecutableAccessorInfo* data = ExecutableAccessorInfo::cast(*structure);
|
| - if (!data->IsCompatibleReceiver(*receiver)) {
|
| + ExecutableAccessorInfo* info = ExecutableAccessorInfo::cast(*structure);
|
| + if (info->HasExpectedReceiverType() &&
|
| + !(receiver->IsHeapObject() &&
|
| + info->IsCompatibleReceiver(HeapObject::cast(*receiver)->map()))) {
|
| Handle<Object> args[2] = { name, receiver };
|
| Handle<Object> error =
|
| isolate->factory()->NewTypeError("incompatible_method_receiver",
|
| @@ -485,13 +489,13 @@ MaybeHandle<Object> Object::SetPropertyWithAccessor(
|
| }
|
| // TODO(rossberg): Support symbols in the API.
|
| if (name->IsSymbol()) return value;
|
| - Object* call_obj = data->setter();
|
| + Object* call_obj = info->setter();
|
| v8::AccessorSetterCallback call_fun =
|
| v8::ToCData<v8::AccessorSetterCallback>(call_obj);
|
| if (call_fun == NULL) return value;
|
| Handle<String> key = Handle<String>::cast(name);
|
| LOG(isolate, ApiNamedPropertyAccess("store", *holder, *name));
|
| - PropertyCallbackArguments args(isolate, data->data(), *receiver, *holder);
|
| + PropertyCallbackArguments args(isolate, info->data(), *receiver, *holder);
|
| args.Call(call_fun,
|
| v8::Utils::ToLocal(key),
|
| v8::Utils::ToLocal(value));
|
|
|