diff --git a/src/objects.cc b/src/objects.cc index 823d8d060f..01e231bb94 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -6167,7 +6167,7 @@ void JSObject::DefineAccessor(Handle object, // Make sure that the top context does not change when doing callbacks or // interceptor calls. - AssertNoContextChangeWithHandleScope ncc; + AssertNoContextChange ncc; // Try to flatten before operating on the string. if (name->IsString()) String::cast(*name)->TryFlatten(); @@ -6412,58 +6412,62 @@ Handle JSObject::SetAccessor(Handle object, } -MaybeObject* JSObject::LookupAccessor(Name* name, AccessorComponent component) { - Heap* heap = GetHeap(); +Handle JSObject::GetAccessor(Handle object, + Handle name, + AccessorComponent component) { + Isolate* isolate = object->GetIsolate(); // Make sure that the top context does not change when doing callbacks or // interceptor calls. - AssertNoContextChangeWithHandleScope ncc; + AssertNoContextChange ncc; // Check access rights if needed. - if (IsAccessCheckNeeded() && - !heap->isolate()->MayNamedAccess(this, name, v8::ACCESS_HAS)) { - heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_HAS); - RETURN_IF_SCHEDULED_EXCEPTION(heap->isolate()); - return heap->undefined_value(); + if (object->IsAccessCheckNeeded() && + !isolate->MayNamedAccess(*object, *name, v8::ACCESS_HAS)) { + isolate->ReportFailedAccessCheck(*object, v8::ACCESS_HAS); + RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); + return isolate->factory()->undefined_value(); } // Make the lookup and include prototypes. uint32_t index = 0; if (name->AsArrayIndex(&index)) { - for (Object* obj = this; - obj != heap->null_value(); - obj = JSReceiver::cast(obj)->GetPrototype()) { - if (obj->IsJSObject() && JSObject::cast(obj)->HasDictionaryElements()) { - JSObject* js_object = JSObject::cast(obj); + for (Handle obj = object; + *obj != isolate->heap()->null_value(); + obj = handle(JSReceiver::cast(*obj)->GetPrototype(), isolate)) { + if (obj->IsJSObject() && JSObject::cast(*obj)->HasDictionaryElements()) { + JSObject* js_object = JSObject::cast(*obj); SeededNumberDictionary* dictionary = js_object->element_dictionary(); int entry = dictionary->FindEntry(index); if (entry != SeededNumberDictionary::kNotFound) { Object* element = dictionary->ValueAt(entry); if (dictionary->DetailsAt(entry).type() == CALLBACKS && element->IsAccessorPair()) { - return AccessorPair::cast(element)->GetComponent(component); + return handle(AccessorPair::cast(element)->GetComponent(component), + isolate); } } } } } else { - for (Object* obj = this; - obj != heap->null_value(); - obj = JSReceiver::cast(obj)->GetPrototype()) { - LookupResult result(heap->isolate()); - JSReceiver::cast(obj)->LocalLookup(name, &result); + for (Handle obj = object; + *obj != isolate->heap()->null_value(); + obj = handle(JSReceiver::cast(*obj)->GetPrototype(), isolate)) { + LookupResult result(isolate); + JSReceiver::cast(*obj)->LocalLookup(*name, &result); if (result.IsFound()) { - if (result.IsReadOnly()) return heap->undefined_value(); + if (result.IsReadOnly()) return isolate->factory()->undefined_value(); if (result.IsPropertyCallbacks()) { Object* obj = result.GetCallbackObject(); if (obj->IsAccessorPair()) { - return AccessorPair::cast(obj)->GetComponent(component); + return handle(AccessorPair::cast(obj)->GetComponent(component), + isolate); } } } } } - return heap->undefined_value(); + return isolate->factory()->undefined_value(); } diff --git a/src/objects.h b/src/objects.h index cdb88b8155..7e3814a6c7 100644 --- a/src/objects.h +++ b/src/objects.h @@ -2218,6 +2218,15 @@ class JSObject: public JSReceiver { uint32_t index, bool continue_search); + // Retrieves an AccessorPair property from the given object. Might return + // undefined if the property doesn't exist or is of a different kind. + static Handle GetAccessor(Handle object, + Handle name, + AccessorComponent component); + + // Defines an AccessorPair property on the given object. + // TODO(mstarzinger): Rename to SetAccessor() and return empty handle on + // exception instead of letting callers check for scheduled exception. static void DefineAccessor(Handle object, Handle name, Handle getter, @@ -2225,8 +2234,7 @@ class JSObject: public JSReceiver { PropertyAttributes attributes, v8::AccessControl access_control = v8::DEFAULT); - MaybeObject* LookupAccessor(Name* name, AccessorComponent component); - + // Defines an AccessorInfo property on the given object. static Handle SetAccessor(Handle object, Handle info); diff --git a/src/runtime.cc b/src/runtime.cc index 38d1d8d1b8..21b5cfe789 100644 --- a/src/runtime.cc +++ b/src/runtime.cc @@ -10582,14 +10582,17 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetArrayKeys) { RUNTIME_FUNCTION(MaybeObject*, Runtime_LookupAccessor) { - SealHandleScope shs(isolate); + HandleScope scope(isolate); ASSERT(args.length() == 3); - CONVERT_ARG_CHECKED(JSReceiver, receiver, 0); - CONVERT_ARG_CHECKED(Name, name, 1); + CONVERT_ARG_HANDLE_CHECKED(JSReceiver, receiver, 0); + CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); CONVERT_SMI_ARG_CHECKED(flag, 2); AccessorComponent component = flag == 0 ? ACCESSOR_GETTER : ACCESSOR_SETTER; if (!receiver->IsJSObject()) return isolate->heap()->undefined_value(); - return JSObject::cast(receiver)->LookupAccessor(name, component); + Handle result = + JSObject::GetAccessor(Handle::cast(receiver), name, component); + RETURN_IF_EMPTY_HANDLE(isolate, result); + return *result; }