From bda7fb22465fc36d99b4053f0ef60cfaa8441209 Mon Sep 17 00:00:00 2001 From: verwaest Date: Tue, 2 Jun 2015 04:52:30 -0700 Subject: [PATCH] Handle Delete of element with LookupIterator BUG=v8:4137 LOG=n Review URL: https://codereview.chromium.org/1157093003 Cr-Commit-Position: refs/heads/master@{#28762} --- src/elements.cc | 84 ++++---------- src/elements.h | 6 +- src/lookup.h | 12 ++ src/objects-inl.h | 13 --- src/objects.cc | 280 +++++++++++++++------------------------------- src/objects.h | 16 +-- 6 files changed, 132 insertions(+), 279 deletions(-) diff --git a/src/elements.cc b/src/elements.cc index bad3c5ba8b..cf55a202b4 100644 --- a/src/elements.cc +++ b/src/elements.cc @@ -669,9 +669,8 @@ class ElementsAccessorBase : public ElementsAccessor { UNIMPLEMENTED(); } - MUST_USE_RESULT virtual MaybeHandle Delete( - Handle obj, uint32_t key, - LanguageMode language_mode) override = 0; + virtual void Delete(Handle obj, uint32_t key, + LanguageMode language_mode) override = 0; static void CopyElementsImpl(FixedArrayBase* from, uint32_t from_start, FixedArrayBase* to, ElementsKind from_kind, @@ -919,17 +918,16 @@ class FastElementsAccessor return length_object; } - static MaybeHandle DeleteCommon(Handle obj, uint32_t key, - LanguageMode language_mode) { + static void DeleteCommon(Handle obj, uint32_t key, + LanguageMode language_mode) { DCHECK(obj->HasFastSmiOrObjectElements() || obj->HasFastDoubleElements() || obj->HasFastArgumentsElements()); Isolate* isolate = obj->GetIsolate(); Heap* heap = obj->GetHeap(); Handle elements(obj->elements()); - if (*elements == heap->empty_fixed_array()) { - return isolate->factory()->true_value(); - } + if (*elements == heap->empty_fixed_array()) return; + Handle backing_store = Handle::cast(elements); bool is_sloppy_arguments_elements_map = backing_store->map() == heap->sloppy_arguments_elements_map(); @@ -943,16 +941,6 @@ class FastElementsAccessor ? Smi::cast(Handle::cast(obj)->length())->value() : backing_store->length()); if (key < length) { - if (obj->map()->is_strong() && !backing_store->is_the_hole(key)) { - if (is_strict(language_mode)) { - Handle name = isolate->factory()->NewNumberFromUint(key); - THROW_NEW_ERROR( - isolate, - NewTypeError(MessageTemplate::kStrongDeleteProperty, obj, name), - Object); - } - return isolate->factory()->false_value(); - } if (!is_sloppy_arguments_elements_map) { ElementsKind kind = KindTraits::Kind; if (IsFastPackedElementsKind(kind)) { @@ -984,12 +972,11 @@ class FastElementsAccessor } } } - return isolate->factory()->true_value(); } - virtual MaybeHandle Delete(Handle obj, uint32_t key, - LanguageMode language_mode) final { - return DeleteCommon(obj, key, language_mode); + virtual void Delete(Handle obj, uint32_t key, + LanguageMode language_mode) final { + DeleteCommon(obj, key, language_mode); } static bool HasElementImpl( @@ -1306,10 +1293,9 @@ class TypedElementsAccessor return obj; } - MUST_USE_RESULT virtual MaybeHandle Delete( - Handle obj, uint32_t key, LanguageMode language_mode) final { + virtual void Delete(Handle obj, uint32_t key, + LanguageMode language_mode) final { // External arrays always ignore deletes. - return obj->GetIsolate()->factory()->true_value(); } static bool HasElementImpl(Handle holder, uint32_t key, @@ -1409,8 +1395,8 @@ class DictionaryElementsAccessor return length_object; } - MUST_USE_RESULT static MaybeHandle DeleteCommon( - Handle obj, uint32_t key, LanguageMode language_mode) { + static void DeleteCommon(Handle obj, uint32_t key, + LanguageMode language_mode) { Isolate* isolate = obj->GetIsolate(); Handle backing_store(FixedArray::cast(obj->elements()), isolate); @@ -1423,28 +1409,10 @@ class DictionaryElementsAccessor Handle::cast(backing_store); int entry = dictionary->FindEntry(key); if (entry != SeededNumberDictionary::kNotFound) { - Handle result; - bool strong = obj->map()->is_strong(); - if (!strong) { - result = SeededNumberDictionary::DeleteProperty(dictionary, entry); - } - if (strong || *result == *isolate->factory()->false_value()) { - // Fail if the property is not configurable, or on a strong object. - if (is_strict(language_mode)) { - Handle name = isolate->factory()->NewNumberFromUint(key); - if (strong) { - THROW_NEW_ERROR( - isolate, - NewTypeError(MessageTemplate::kStrongDeleteProperty, obj, name), - Object); - } - THROW_NEW_ERROR( - isolate, - NewTypeError(MessageTemplate::kStrictDeleteProperty, name, obj), - Object); - } - return isolate->factory()->false_value(); - } + Handle result = + SeededNumberDictionary::DeleteProperty(dictionary, entry); + USE(result); + DCHECK(result->IsTrue()); Handle new_elements = SeededNumberDictionary::Shrink(dictionary, key); @@ -1454,7 +1422,6 @@ class DictionaryElementsAccessor obj->set_elements(*new_elements); } } - return isolate->factory()->true_value(); } static void CopyElementsImpl(FixedArrayBase* from, uint32_t from_start, @@ -1469,9 +1436,9 @@ class DictionaryElementsAccessor friend class ElementsAccessorBase >; - MUST_USE_RESULT virtual MaybeHandle Delete( - Handle obj, uint32_t key, LanguageMode language_mode) final { - return DeleteCommon(obj, key, language_mode); + virtual void Delete(Handle obj, uint32_t key, + LanguageMode language_mode) final { + DeleteCommon(obj, key, language_mode); } static Handle GetImpl(Handle obj, uint32_t key, @@ -1631,8 +1598,8 @@ class SloppyArgumentsElementsAccessor : public ElementsAccessorBase< return obj; } - MUST_USE_RESULT virtual MaybeHandle Delete( - Handle obj, uint32_t key, LanguageMode language_mode) final { + virtual void Delete(Handle obj, uint32_t key, + LanguageMode language_mode) final { Isolate* isolate = obj->GetIsolate(); Handle parameter_map(FixedArray::cast(obj->elements())); Handle probe(GetParameterMapArg(*parameter_map, key), isolate); @@ -1644,17 +1611,14 @@ class SloppyArgumentsElementsAccessor : public ElementsAccessorBase< } else { Handle arguments(FixedArray::cast(parameter_map->get(1))); if (arguments->IsDictionary()) { - return DictionaryElementsAccessor::DeleteCommon(obj, key, - language_mode); + DictionaryElementsAccessor::DeleteCommon(obj, key, language_mode); } else { // It's difficult to access the version of DeleteCommon that is declared // in the templatized super class, call the concrete implementation in // the class for the most generalized ElementsKind subclass. - return FastHoleyObjectElementsAccessor::DeleteCommon(obj, key, - language_mode); + FastHoleyObjectElementsAccessor::DeleteCommon(obj, key, language_mode); } } - return isolate->factory()->true_value(); } static void CopyElementsImpl(FixedArrayBase* from, uint32_t from_start, diff --git a/src/elements.h b/src/elements.h index 1065b1f73d..49faeab0db 100644 --- a/src/elements.h +++ b/src/elements.h @@ -102,9 +102,9 @@ class ElementsAccessor { int capacity, int length) = 0; - // Deletes an element in an object, returning a new elements backing store. - MUST_USE_RESULT virtual MaybeHandle Delete( - Handle holder, uint32_t key, LanguageMode language_mode) = 0; + // Deletes an element in an object. + virtual void Delete(Handle holder, uint32_t key, + LanguageMode language_mode) = 0; // If kCopyToEnd is specified as the copy_size to CopyElements, it copies all // of elements from source after source_start to the destination array. diff --git a/src/lookup.h b/src/lookup.h index ed54a7ef73..29b7d77b27 100644 --- a/src/lookup.h +++ b/src/lookup.h @@ -59,6 +59,12 @@ class LookupIterator final BASE_EMBEDDED { holder_map_(holder_->map(), isolate_), initial_holder_(holder_), number_(DescriptorArray::kNotFound) { +#if 0 // TODO(verwaest): Enable once blocking hacks are removed. +#ifdef DEBUG + uint32_t index; // Assert that the name is not an array index. + DCHECK(!name->AsArrayIndex(&index)); +#endif // DEBUG +#endif Next(); } @@ -79,6 +85,12 @@ class LookupIterator final BASE_EMBEDDED { holder_map_(holder_->map(), isolate_), initial_holder_(holder_), number_(DescriptorArray::kNotFound) { +#if 0 // TODO(verwaest): Enable once blocking hacks are removed. +#ifdef DEBUG + uint32_t index; // Assert that the name is not an array index. + DCHECK(!name->AsArrayIndex(&index)); +#endif // DEBUG +#endif Next(); } diff --git a/src/objects-inl.h b/src/objects-inl.h index 895d39fd8e..b1808be3c4 100644 --- a/src/objects-inl.h +++ b/src/objects-inl.h @@ -1193,11 +1193,6 @@ MaybeHandle Object::GetProperty(Isolate* isolate, Handle object, const char* name) { Handle str = isolate->factory()->InternalizeUtf8String(name); - DCHECK(!str.is_null()); -#ifdef DEBUG - uint32_t index; // Assert that the name is not an array index. - DCHECK(!str->AsArrayIndex(&index)); -#endif // DEBUG return GetProperty(object, str); } @@ -1213,14 +1208,6 @@ MaybeHandle JSProxy::SetElementWithHandler(Handle proxy, } -Maybe JSProxy::HasElementWithHandler(Handle proxy, - uint32_t index) { - Isolate* isolate = proxy->GetIsolate(); - Handle name = isolate->factory()->Uint32ToString(index); - return HasPropertyWithHandler(proxy, name); -} - - #define FIELD_ADDR(p, offset) \ (reinterpret_cast(p) + offset - kHeapObjectTag) diff --git a/src/objects.cc b/src/objects.cc index 661d769e5d..2390802777 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -3941,14 +3941,6 @@ MaybeHandle JSProxy::DeletePropertyWithHandler( } -MaybeHandle JSProxy::DeleteElementWithHandler( - Handle proxy, uint32_t index, LanguageMode language_mode) { - Isolate* isolate = proxy->GetIsolate(); - Handle name = isolate->factory()->Uint32ToString(index); - return JSProxy::DeletePropertyWithHandler(proxy, name, language_mode); -} - - Maybe JSProxy::GetPropertyAttributesWithHandler( Handle proxy, Handle receiver, Handle name) { Isolate* isolate = proxy->GetIsolate(); @@ -5031,23 +5023,40 @@ Handle JSObject::SetHiddenPropertiesHashTable(Handle object, MaybeHandle JSObject::DeletePropertyWithInterceptor( - Handle holder, Handle receiver, Handle name) { - Isolate* isolate = holder->GetIsolate(); + LookupIterator* it) { + Isolate* isolate = it->isolate(); + // Make sure that the top context does not change when doing callbacks or + // interceptor calls. + AssertNoContextChange ncc(isolate); - Handle interceptor(holder->GetNamedInterceptor()); - if (interceptor->deleter()->IsUndefined() || - (name->IsSymbol() && !interceptor->can_intercept_symbols())) { + DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state()); + Handle interceptor(it->GetInterceptor()); + if (interceptor->deleter()->IsUndefined()) return MaybeHandle(); + + Handle holder = it->GetHolder(); + + PropertyCallbackArguments args(isolate, interceptor->data(), + *it->GetReceiver(), *holder); + v8::Handle result; + if (it->IsElement()) { + uint32_t index = it->index(); + v8::IndexedPropertyDeleterCallback deleter = + v8::ToCData(interceptor->deleter()); + LOG(isolate, + ApiIndexedPropertyAccess("interceptor-indexed-delete", *holder, index)); + result = args.Call(deleter, index); + } else if (it->name()->IsSymbol() && !interceptor->can_intercept_symbols()) { return MaybeHandle(); + } else { + Handle name = it->name(); + v8::GenericNamedPropertyDeleterCallback deleter = + v8::ToCData( + interceptor->deleter()); + LOG(isolate, + ApiNamedPropertyAccess("interceptor-named-delete", *holder, *name)); + result = args.Call(deleter, v8::Utils::ToLocal(name)); } - v8::GenericNamedPropertyDeleterCallback deleter = - v8::ToCData( - interceptor->deleter()); - LOG(isolate, - ApiNamedPropertyAccess("interceptor-named-delete", *holder, *name)); - PropertyCallbackArguments args(isolate, interceptor->data(), *receiver, - *holder); - v8::Handle result = args.Call(deleter, v8::Utils::ToLocal(name)); RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); if (result.IsEmpty()) return MaybeHandle(); @@ -5059,116 +5068,6 @@ MaybeHandle JSObject::DeletePropertyWithInterceptor( } -MaybeHandle JSObject::DeleteElementWithInterceptor( - Handle object, - uint32_t index) { - Isolate* isolate = object->GetIsolate(); - Factory* factory = isolate->factory(); - - // Make sure that the top context does not change when doing - // callbacks or interceptor calls. - AssertNoContextChange ncc(isolate); - - Handle interceptor(object->GetIndexedInterceptor()); - if (interceptor->deleter()->IsUndefined()) return factory->false_value(); - v8::IndexedPropertyDeleterCallback deleter = - v8::ToCData(interceptor->deleter()); - LOG(isolate, - ApiIndexedPropertyAccess("interceptor-indexed-delete", *object, index)); - PropertyCallbackArguments args( - isolate, interceptor->data(), *object, *object); - v8::Handle result = args.Call(deleter, index); - RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); - if (!result.IsEmpty()) { - DCHECK(result->IsBoolean()); - Handle result_internal = v8::Utils::OpenHandle(*result); - result_internal->VerifyApiCallResultType(); - // Rebox CustomArguments::kReturnValueOffset before returning. - return handle(*result_internal, isolate); - } - // TODO(verwaest): Shouldn't this be the mode that was passed in? - MaybeHandle delete_result = - object->GetElementsAccessor()->Delete(object, index, SLOPPY); - return delete_result; -} - - -MaybeHandle JSObject::DeleteElement(Handle object, - uint32_t index, - LanguageMode language_mode) { - Isolate* isolate = object->GetIsolate(); - Factory* factory = isolate->factory(); - - // Check access rights if needed. - if (object->IsAccessCheckNeeded() && !isolate->MayAccess(object)) { - isolate->ReportFailedAccessCheck(object); - RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); - return factory->false_value(); - } - - if (object->IsStringObjectWithCharacterAt(index)) { - if (is_strict(language_mode)) { - // Deleting a non-configurable property in strict mode. - Handle name = factory->NewNumberFromUint(index); - THROW_NEW_ERROR( - isolate, - NewTypeError(MessageTemplate::kStrictDeleteProperty, name, object), - Object); - } - return factory->false_value(); - } - - if (object->IsJSGlobalProxy()) { - PrototypeIterator iter(isolate, object); - if (iter.IsAtEnd()) return factory->false_value(); - DCHECK(PrototypeIterator::GetCurrent(iter)->IsJSGlobalObject()); - return DeleteElement( - Handle::cast(PrototypeIterator::GetCurrent(iter)), index, - language_mode); - } - - Handle old_value; - bool should_enqueue_change_record = false; - if (object->map()->is_observed()) { - Maybe maybe = HasOwnElement(object, index); - if (!maybe.IsJust()) return MaybeHandle(); - should_enqueue_change_record = maybe.FromJust(); - if (should_enqueue_change_record) { - if (!GetOwnElementAccessorPair(object, index).is_null()) { - old_value = Handle::cast(factory->the_hole_value()); - } else { - old_value = Object::GetElement( - isolate, object, index).ToHandleChecked(); - } - } - } - - // Skip interceptor if forcing deletion. - MaybeHandle maybe_result; - if (object->HasIndexedInterceptor()) { - maybe_result = DeleteElementWithInterceptor(object, index); - } else { - maybe_result = - object->GetElementsAccessor()->Delete(object, index, language_mode); - } - Handle result; - ASSIGN_RETURN_ON_EXCEPTION(isolate, result, maybe_result, Object); - - if (should_enqueue_change_record) { - Maybe maybe = HasOwnElement(object, index); - if (!maybe.IsJust()) return MaybeHandle(); - if (!maybe.FromJust()) { - Handle name = factory->Uint32ToString(index); - RETURN_ON_EXCEPTION( - isolate, EnqueueChangeRecord(object, "delete", name, old_value), - Object); - } - } - - return result; -} - - void JSObject::DeleteNormalizedProperty(Handle object, Handle name) { DCHECK(!object->HasFastProperties()); @@ -5198,121 +5097,122 @@ void JSObject::DeleteNormalizedProperty(Handle object, } -MaybeHandle JSObject::DeleteProperty(Handle object, - Handle name, - LanguageMode language_mode) { - // ECMA-262, 3rd, 8.6.2.5 - DCHECK(name->IsName()); - - uint32_t index = 0; - if (name->AsArrayIndex(&index)) { - return DeleteElement(object, index, language_mode); +// ECMA-262, 3rd, 8.6.2.5 +MaybeHandle JSReceiver::DeleteProperty(LookupIterator* it, + LanguageMode language_mode) { + Isolate* isolate = it->isolate(); + if (it->state() == LookupIterator::JSPROXY) { + return JSProxy::DeletePropertyWithHandler(it->GetHolder(), + it->GetName(), language_mode); } - LookupIterator it(object, name, LookupIterator::HIDDEN); + Handle receiver = Handle::cast(it->GetReceiver()); - bool is_observed = object->map()->is_observed() && - !it.isolate()->IsInternallyUsedPropertyName(name); - Handle old_value = it.isolate()->factory()->the_hole_value(); + bool is_observed = + receiver->map()->is_observed() && + (it->IsElement() || !isolate->IsInternallyUsedPropertyName(it->name())); - for (; it.IsFound(); it.Next()) { - switch (it.state()) { + Handle old_value = it->factory()->the_hole_value(); + + for (; it->IsFound(); it->Next()) { + switch (it->state()) { case LookupIterator::JSPROXY: case LookupIterator::NOT_FOUND: case LookupIterator::TRANSITION: UNREACHABLE(); case LookupIterator::ACCESS_CHECK: - if (it.HasAccess()) break; - it.isolate()->ReportFailedAccessCheck(it.GetHolder()); - RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it.isolate(), Object); - return it.isolate()->factory()->false_value(); + if (it->HasAccess()) break; + isolate->ReportFailedAccessCheck(it->GetHolder()); + RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); + return it->factory()->false_value(); case LookupIterator::INTERCEPTOR: { MaybeHandle maybe_result = - JSObject::DeletePropertyWithInterceptor(it.GetHolder(), - object, it.name()); + JSObject::DeletePropertyWithInterceptor(it); // Delete with interceptor succeeded. Return result. if (!maybe_result.is_null()) return maybe_result; // An exception was thrown in the interceptor. Propagate. - if (it.isolate()->has_pending_exception()) return maybe_result; + if (isolate->has_pending_exception()) return maybe_result; break; } case LookupIterator::INTEGER_INDEXED_EXOTIC: - return it.isolate()->factory()->true_value(); + return it->factory()->true_value(); case LookupIterator::DATA: if (is_observed) { - old_value = it.GetDataValue(); + old_value = it->GetDataValue(); } // Fall through. case LookupIterator::ACCESSOR: { - if (!it.IsConfigurable() || object->map()->is_strong()) { + if (!it->IsConfigurable() || receiver->map()->is_strong()) { // Fail if the property is not configurable, or on a strong object. if (is_strict(language_mode)) { - if (object->map()->is_strong()) { + if (receiver->map()->is_strong()) { THROW_NEW_ERROR( - it.isolate(), - NewTypeError(MessageTemplate::kStrongDeleteProperty, object, - name), + isolate, NewTypeError(MessageTemplate::kStrongDeleteProperty, + receiver, it->GetName()), Object); } - THROW_NEW_ERROR(it.isolate(), + THROW_NEW_ERROR(isolate, NewTypeError(MessageTemplate::kStrictDeleteProperty, - name, object), + it->GetName(), receiver), Object); } - return it.isolate()->factory()->false_value(); + return it->factory()->false_value(); } - PropertyNormalizationMode mode = object->map()->is_prototype_map() - ? KEEP_INOBJECT_PROPERTIES - : CLEAR_INOBJECT_PROPERTIES; - Handle holder = it.GetHolder(); + Handle holder = it->GetHolder(); // TODO(verwaest): Remove this temporary compatibility hack when blink // tests are updated. - if (!holder.is_identical_to(object) && - !(object->IsJSGlobalProxy() && holder->IsJSGlobalObject())) { - return it.isolate()->factory()->true_value(); + if (!holder.is_identical_to(receiver) && + !(receiver->IsJSGlobalProxy() && holder->IsJSGlobalObject())) { + return it->factory()->true_value(); } - NormalizeProperties(holder, mode, 0, "DeletingProperty"); - DeleteNormalizedProperty(holder, name); - ReoptimizeIfPrototype(holder); + if (it->IsElement()) { + ElementsAccessor* accessor = holder->GetElementsAccessor(); + accessor->Delete(holder, it->index(), language_mode); + } else { + PropertyNormalizationMode mode = holder->map()->is_prototype_map() + ? KEEP_INOBJECT_PROPERTIES + : CLEAR_INOBJECT_PROPERTIES; + + JSObject::NormalizeProperties(holder, mode, 0, "DeletingProperty"); + JSObject::DeleteNormalizedProperty(holder, it->name()); + JSObject::ReoptimizeIfPrototype(holder); + } if (is_observed) { - RETURN_ON_EXCEPTION( - it.isolate(), - EnqueueChangeRecord(object, "delete", name, old_value), Object); + RETURN_ON_EXCEPTION(isolate, + JSObject::EnqueueChangeRecord( + receiver, "delete", it->GetName(), old_value), + Object); } - return it.isolate()->factory()->true_value(); + return it->factory()->true_value(); } } } - return it.isolate()->factory()->true_value(); + return it->factory()->true_value(); } MaybeHandle JSReceiver::DeleteElement(Handle object, uint32_t index, LanguageMode language_mode) { - if (object->IsJSProxy()) { - return JSProxy::DeleteElementWithHandler(Handle::cast(object), - index, language_mode); - } - return JSObject::DeleteElement(Handle::cast(object), index, - language_mode); + LookupIterator it(object->GetIsolate(), object, index); + return DeleteProperty(&it, language_mode); } MaybeHandle JSReceiver::DeleteProperty(Handle object, Handle name, LanguageMode language_mode) { - if (object->IsJSProxy()) { - return JSProxy::DeletePropertyWithHandler(Handle::cast(object), - name, language_mode); - } - return JSObject::DeleteProperty(Handle::cast(object), name, - language_mode); + uint32_t index; + LookupIterator::Configuration c = LookupIterator::HIDDEN; + LookupIterator it = name->AsArrayIndex(&index) + ? LookupIterator(name->GetIsolate(), object, index, c) + : LookupIterator(object, name, c); + return JSObject::DeleteProperty(&it, language_mode); } diff --git a/src/objects.h b/src/objects.h index 1a1cb0932f..4f78eb16bc 100644 --- a/src/objects.h +++ b/src/objects.h @@ -1658,6 +1658,8 @@ class JSReceiver: public HeapObject { MUST_USE_RESULT static MaybeHandle DeleteProperty( Handle object, Handle name, LanguageMode language_mode = SLOPPY); + MUST_USE_RESULT static MaybeHandle DeleteProperty( + LookupIterator* it, LanguageMode language_mode); MUST_USE_RESULT static MaybeHandle DeleteElement( Handle object, uint32_t index, LanguageMode language_mode = SLOPPY); @@ -2325,21 +2327,13 @@ class JSObject: public JSReceiver { Handle value, PropertyAttributes attributes); - MUST_USE_RESULT static MaybeHandle DeleteProperty( - Handle object, Handle name, LanguageMode language_mode); MUST_USE_RESULT static MaybeHandle DeletePropertyWithInterceptor( - Handle holder, Handle receiver, Handle name); + LookupIterator* it); // Deletes an existing named property in a normalized object. static void DeleteNormalizedProperty(Handle object, Handle name); - MUST_USE_RESULT static MaybeHandle DeleteElement( - Handle object, uint32_t index, LanguageMode language_mode); - MUST_USE_RESULT static MaybeHandle DeleteElementWithInterceptor( - Handle object, - uint32_t index); - bool ReferencesObjectFromElements(FixedArray* elements, ElementsKind kind, Object* object); @@ -10032,13 +10026,9 @@ class JSProxy: public JSReceiver { MUST_USE_RESULT static Maybe HasPropertyWithHandler( Handle proxy, Handle name); - MUST_USE_RESULT static inline Maybe HasElementWithHandler( - Handle proxy, uint32_t index); MUST_USE_RESULT static MaybeHandle DeletePropertyWithHandler( Handle proxy, Handle name, LanguageMode language_mode); - MUST_USE_RESULT static MaybeHandle DeleteElementWithHandler( - Handle proxy, uint32_t index, LanguageMode language_mode); MUST_USE_RESULT Object* GetIdentityHash();