| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 43951a7b54e8b1f1ac51c31a8068a27736799967..db87b94ee3f502357c0942d1e46fc1a82c8d8f9f 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -6177,7 +6177,7 @@ void JSObject::DefineAccessor(Handle<JSObject> 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();
|
| @@ -6422,58 +6422,62 @@ Handle<Object> JSObject::SetAccessor(Handle<JSObject> object,
|
| }
|
|
|
|
|
| -MaybeObject* JSObject::LookupAccessor(Name* name, AccessorComponent component) {
|
| - Heap* heap = GetHeap();
|
| +Handle<Object> JSObject::GetAccessor(Handle<JSObject> object,
|
| + Handle<Name> 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<Object> 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<Object> 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();
|
| }
|
|
|
|
|
|
|