@@ -572,19 +572,12 @@ MaybeHandle<Object> Object::SetPropertyWithDefinedSetter(
572572
573573
574574static bool FindAllCanReadHolder(LookupIterator* it) {
575- // Skip current iteration, it's in state ACCESS_CHECK or INTERCEPTOR, both of
576- // which have already been checked.
577- DCHECK(it->state() == LookupIterator::ACCESS_CHECK ||
578- it->state() == LookupIterator::INTERCEPTOR);
579- for (it->Next(); it->IsFound(); it->Next()) {
575+ for (; it->IsFound(); it->Next()) {
580576 if (it->state() == LookupIterator::ACCESSOR) {
581- auto accessors = it->GetAccessors();
577+ Handle<Object> accessors = it->GetAccessors();
582578 if (accessors->IsAccessorInfo()) {
583579 if (AccessorInfo::cast(*accessors)->all_can_read()) return true;
584580 }
585- } else if (it->state() == LookupIterator::INTERCEPTOR) {
586- auto holder = it->GetHolder<JSObject>();
587- if (holder->GetNamedInterceptor()->all_can_read()) return true;
588581 }
589582 }
590583 return false;
@@ -594,18 +587,10 @@ static bool FindAllCanReadHolder(LookupIterator* it) {
594587MaybeHandle<Object> JSObject::GetPropertyWithFailedAccessCheck(
595588 LookupIterator* it) {
596589 Handle<JSObject> checked = it->GetHolder<JSObject>();
597- while (FindAllCanReadHolder(it)) {
598- if (it->state() == LookupIterator::ACCESSOR) {
599- return GetPropertyWithAccessor(it->GetReceiver(), it->name(),
600- it->GetHolder<JSObject>(),
601- it->GetAccessors());
602- }
603- DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state());
604- auto receiver = Handle<JSObject>::cast(it->GetReceiver());
605- auto result = GetPropertyWithInterceptor(it->GetHolder<JSObject>(),
606- receiver, it->name());
607- if (it->isolate()->has_scheduled_exception()) break;
608- if (!result.is_null()) return result;
590+ if (FindAllCanReadHolder(it)) {
591+ return GetPropertyWithAccessor(it->GetReceiver(), it->name(),
592+ it->GetHolder<JSObject>(),
593+ it->GetAccessors());
609594 }
610595 it->isolate()->ReportFailedAccessCheck(checked, v8::ACCESS_GET);
611596 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object);
@@ -616,16 +601,8 @@ MaybeHandle<Object> JSObject::GetPropertyWithFailedAccessCheck(
616601Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithFailedAccessCheck(
617602 LookupIterator* it) {
618603 Handle<JSObject> checked = it->GetHolder<JSObject>();
619- while (FindAllCanReadHolder(it)) {
620- if (it->state() == LookupIterator::ACCESSOR) {
621- return maybe(it->property_details().attributes());
622- }
623- DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state());
624- auto result = GetPropertyAttributesWithInterceptor(
625- it->GetHolder<JSObject>(), it->GetReceiver(), it->name());
626- if (it->isolate()->has_scheduled_exception()) break;
627- if (result.has_value && result.value != ABSENT) return result;
628- }
604+ if (FindAllCanReadHolder(it))
605+ return maybe(it->property_details().attributes());
629606 it->isolate()->ReportFailedAccessCheck(checked, v8::ACCESS_HAS);
630607 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(it->isolate(),
631608 Maybe<PropertyAttributes>());
@@ -759,65 +736,6 @@ Handle<Object> JSObject::DeleteNormalizedProperty(Handle<JSObject> object,
759736}
760737
761738
762- static MaybeHandle<JSObject> FindIndexedAllCanReadHolder(
763- Isolate* isolate, Handle<JSObject> js_object,
764- PrototypeIterator::WhereToStart where_to_start) {
765- for (PrototypeIterator iter(isolate, js_object, where_to_start);
766- !iter.IsAtEnd(); iter.Advance()) {
767- auto curr = PrototypeIterator::GetCurrent(iter);
768- if (!curr->IsJSObject()) break;
769- auto obj = Handle<JSObject>::cast(curr);
770- if (!obj->HasIndexedInterceptor()) continue;
771- if (obj->GetIndexedInterceptor()->all_can_read()) return obj;
772- }
773- return MaybeHandle<JSObject>();
774- }
775-
776-
777- MaybeHandle<Object> JSObject::GetElementWithFailedAccessCheck(
778- Isolate* isolate, Handle<JSObject> object, Handle<Object> receiver,
779- uint32_t index) {
780- Handle<JSObject> holder = object;
781- PrototypeIterator::WhereToStart where_to_start =
782- PrototypeIterator::START_AT_RECEIVER;
783- while (true) {
784- auto all_can_read_holder =
785- FindIndexedAllCanReadHolder(isolate, holder, where_to_start);
786- if (!all_can_read_holder.ToHandle(&holder)) break;
787- auto result =
788- JSObject::GetElementWithInterceptor(holder, receiver, index, false);
789- if (isolate->has_scheduled_exception()) break;
790- if (!result.is_null()) return result;
791- where_to_start = PrototypeIterator::START_AT_PROTOTYPE;
792- }
793- isolate->ReportFailedAccessCheck(object, v8::ACCESS_GET);
794- RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
795- return isolate->factory()->undefined_value();
796- }
797-
798-
799- Maybe<PropertyAttributes> JSObject::GetElementAttributesWithFailedAccessCheck(
800- Isolate* isolate, Handle<JSObject> object, Handle<Object> receiver,
801- uint32_t index) {
802- Handle<JSObject> holder = object;
803- PrototypeIterator::WhereToStart where_to_start =
804- PrototypeIterator::START_AT_RECEIVER;
805- while (true) {
806- auto all_can_read_holder =
807- FindIndexedAllCanReadHolder(isolate, holder, where_to_start);
808- if (!all_can_read_holder.ToHandle(&holder)) break;
809- auto result =
810- JSObject::GetElementAttributeFromInterceptor(object, receiver, index);
811- if (isolate->has_scheduled_exception()) break;
812- if (result.has_value && result.value != ABSENT) return result;
813- where_to_start = PrototypeIterator::START_AT_PROTOTYPE;
814- }
815- isolate->ReportFailedAccessCheck(object, v8::ACCESS_HAS);
816- RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Maybe<PropertyAttributes>());
817- return maybe(ABSENT);
818- }
819-
820-
821739MaybeHandle<Object> Object::GetElementWithReceiver(Isolate* isolate,
822740 Handle<Object> object,
823741 Handle<Object> receiver,
@@ -850,14 +768,14 @@ MaybeHandle<Object> Object::GetElementWithReceiver(Isolate* isolate,
850768 // Check access rights if needed.
851769 if (js_object->IsAccessCheckNeeded()) {
852770 if (!isolate->MayIndexedAccess(js_object, index, v8::ACCESS_GET)) {
853- return JSObject::GetElementWithFailedAccessCheck(isolate, js_object,
854- receiver, index);
771+ isolate->ReportFailedAccessCheck(js_object, v8::ACCESS_GET);
772+ RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
773+ return isolate->factory()->undefined_value();
855774 }
856775 }
857776
858777 if (js_object->HasIndexedInterceptor()) {
859- return JSObject::GetElementWithInterceptor(js_object, receiver, index,
860- true);
778+ return JSObject::GetElementWithInterceptor(js_object, receiver, index);
861779 }
862780
863781 if (js_object->elements() != isolate->heap()->empty_fixed_array()) {
@@ -4266,8 +4184,9 @@ Maybe<PropertyAttributes> JSObject::GetElementAttributeWithReceiver(
42664184 // Check access rights if needed.
42674185 if (object->IsAccessCheckNeeded()) {
42684186 if (!isolate->MayIndexedAccess(object, index, v8::ACCESS_HAS)) {
4269- return GetElementAttributesWithFailedAccessCheck(isolate, object,
4270- receiver, index);
4187+ isolate->ReportFailedAccessCheck(object, v8::ACCESS_HAS);
4188+ RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Maybe<PropertyAttributes>());
4189+ return maybe(ABSENT);
42714190 }
42724191 }
42734192
@@ -13464,10 +13383,10 @@ MaybeHandle<Object> JSArray::ReadOnlyLengthError(Handle<JSArray> array) {
1346413383}
1346513384
1346613385
13467- MaybeHandle<Object> JSObject::GetElementWithInterceptor(Handle<JSObject> object,
13468- Handle<Object> receiver ,
13469- uint32_t index ,
13470- bool check_prototype ) {
13386+ MaybeHandle<Object> JSObject::GetElementWithInterceptor(
13387+ Handle<JSObject> object ,
13388+ Handle<Object> receiver ,
13389+ uint32_t index ) {
1347113390 Isolate* isolate = object->GetIsolate();
1347213391
1347313392 // Make sure that the top context does not change when doing
@@ -13492,8 +13411,6 @@ MaybeHandle<Object> JSObject::GetElementWithInterceptor(Handle<JSObject> object,
1349213411 }
1349313412 }
1349413413
13495- if (!check_prototype) return MaybeHandle<Object>();
13496-
1349713414 ElementsAccessor* handler = object->GetElementsAccessor();
1349813415 Handle<Object> result;
1349913416 ASSIGN_RETURN_ON_EXCEPTION(
0 commit comments