Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 400be3edaebb01269d94481d7b0e7c59c2043e3e..48becb50dc5567a1aa047a2ba5d68505f5c3ef51 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -6371,21 +6371,6 @@ MaybeHandle<Object> JSObject::DefineAccessor(Handle<JSObject> object, |
Handle<Object> setter, |
PropertyAttributes attributes) { |
Isolate* isolate = object->GetIsolate(); |
- // Check access rights if needed. |
- if (object->IsAccessCheckNeeded() && !isolate->MayAccess(object)) { |
- isolate->ReportFailedAccessCheck(object); |
- RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
- return isolate->factory()->undefined_value(); |
- } |
- |
- if (object->IsJSGlobalProxy()) { |
- PrototypeIterator iter(isolate, object); |
- if (iter.IsAtEnd()) return isolate->factory()->undefined_value(); |
- DCHECK(PrototypeIterator::GetCurrent(iter)->IsJSGlobalObject()); |
- DefineAccessor(Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter)), |
- name, getter, setter, attributes); |
- return isolate->factory()->undefined_value(); |
- } |
// Make sure that the top context does not change when doing callbacks or |
// interceptor calls. |
@@ -6395,39 +6380,36 @@ MaybeHandle<Object> JSObject::DefineAccessor(Handle<JSObject> object, |
if (name->IsString()) name = String::Flatten(Handle<String>::cast(name)); |
uint32_t index = 0; |
- bool is_element = name->AsArrayIndex(&index); |
+ LookupIterator::Configuration c = LookupIterator::HIDDEN_SKIP_INTERCEPTOR; |
+ LookupIterator it = name->AsArrayIndex(&index) |
+ ? LookupIterator(isolate, object, index, c) |
+ : LookupIterator(object, name, c); |
+ |
+ if (it.state() == LookupIterator::ACCESS_CHECK) { |
+ if (!it.HasAccess()) { |
+ isolate->ReportFailedAccessCheck(it.GetHolder<JSObject>()); |
+ RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
+ return isolate->factory()->undefined_value(); |
+ } |
+ it.Next(); |
+ } |
Handle<Object> old_value = isolate->factory()->the_hole_value(); |
bool is_observed = object->map()->is_observed() && |
!isolate->IsInternallyUsedPropertyName(name); |
bool preexists = false; |
if (is_observed) { |
- if (is_element) { |
- Maybe<bool> maybe = HasOwnElement(object, index); |
- // Workaround for a GCC 4.4.3 bug which leads to "‘preexists’ may be used |
- // uninitialized in this function". |
- if (!maybe.IsJust()) { |
- DCHECK(false); |
- return isolate->factory()->undefined_value(); |
- } |
- preexists = maybe.FromJust(); |
- if (preexists && GetOwnElementAccessorPair(object, index).is_null()) { |
- old_value = |
- Object::GetElement(isolate, object, index).ToHandleChecked(); |
- } |
- } else { |
- LookupIterator it(object, name, LookupIterator::HIDDEN_SKIP_INTERCEPTOR); |
- CHECK(GetPropertyAttributes(&it).IsJust()); |
- preexists = it.IsFound(); |
- if (preexists && (it.state() == LookupIterator::DATA || |
- it.GetAccessors()->IsAccessorInfo())) { |
- old_value = GetProperty(&it).ToHandleChecked(); |
- } |
+ CHECK(GetPropertyAttributes(&it).IsJust()); |
+ preexists = it.IsFound(); |
+ if (preexists && (it.state() == LookupIterator::DATA || |
+ it.GetAccessors()->IsAccessorInfo())) { |
+ old_value = GetProperty(&it).ToHandleChecked(); |
} |
} |
- if (is_element) { |
- DefineElementAccessor(object, index, getter, setter, attributes); |
+ if (it.IsElement()) { |
+ DefineElementAccessor(it.GetStoreTarget(), index, getter, setter, |
+ attributes); |
} else { |
DCHECK(getter->IsSpecFunction() || getter->IsUndefined() || |
getter->IsNull()); |
@@ -6435,11 +6417,6 @@ MaybeHandle<Object> JSObject::DefineAccessor(Handle<JSObject> object, |
setter->IsNull()); |
// At least one of the accessors needs to be a new value. |
DCHECK(!getter->IsNull() || !setter->IsNull()); |
- LookupIterator it(object, name, LookupIterator::OWN_SKIP_INTERCEPTOR); |
- if (it.state() == LookupIterator::ACCESS_CHECK) { |
- // We already did an access check before. We do have access. |
- it.Next(); |
- } |
if (!getter->IsNull()) { |
it.TransitionToAccessorProperty(ACCESSOR_GETTER, getter, attributes); |
} |