ElementsAccessorSubclass::ValidateImpl(holder);
}
+ static bool HasElementImpl(Handle<JSObject> holder, uint32_t key,
+ Handle<FixedArrayBase> backing_store) {
+ return ElementsAccessorSubclass::GetAttributesImpl(
+ *holder, key, *backing_store) != ABSENT;
+ }
+
virtual bool HasElement(Handle<JSObject> holder, uint32_t key,
Handle<FixedArrayBase> backing_store) final {
- return ElementsAccessorSubclass::GetIndexForKeyImpl(*holder, *backing_store,
- key) != kMaxUInt32;
+ return ElementsAccessorSubclass::HasElementImpl(holder, key, backing_store);
}
virtual Handle<Object> Get(Handle<JSObject> holder, uint32_t key,
obj, Handle<BackingStore>::cast(backing_store), key, value);
}
+ virtual PropertyAttributes GetAttributes(
+ JSObject* holder, uint32_t key, FixedArrayBase* backing_store) final {
+ return ElementsAccessorSubclass::GetAttributesImpl(holder, key,
+ backing_store);
+ }
+
+ static PropertyAttributes GetAttributesImpl(JSObject* obj, uint32_t key,
+ FixedArrayBase* backing_store) {
+ if (key >= ElementsAccessorSubclass::GetCapacityImpl(obj, backing_store)) {
+ return ABSENT;
+ }
+ return BackingStore::cast(backing_store)->is_the_hole(key) ? ABSENT : NONE;
+ }
+
virtual MaybeHandle<AccessorPair> GetAccessorPair(
Handle<JSObject> holder, uint32_t key,
Handle<FixedArrayBase> backing_store) final {
return ElementsAccessorSubclass::GetKeyForIndexImpl(backing_store, index);
}
- static uint32_t GetIndexForKeyImpl(JSObject* holder,
- FixedArrayBase* backing_store,
+ static uint32_t GetIndexForKeyImpl(FixedArrayBase* backing_store,
uint32_t key) {
- return key < ElementsAccessorSubclass::GetCapacityImpl(holder,
- backing_store) &&
- !BackingStore::cast(backing_store)->is_the_hole(key)
- ? key
- : kMaxUInt32;
+ return key;
}
- virtual uint32_t GetIndexForKey(JSObject* holder,
- FixedArrayBase* backing_store,
+ virtual uint32_t GetIndexForKey(FixedArrayBase* backing_store,
uint32_t key) final {
- return ElementsAccessorSubclass::GetIndexForKeyImpl(holder, backing_store,
- key);
+ return ElementsAccessorSubclass::GetIndexForKeyImpl(backing_store, key);
}
static PropertyDetails GetDetailsImpl(FixedArrayBase* backing_store,
DeleteCommon(obj, key, language_mode);
}
+ static bool HasElementImpl(
+ Handle<JSObject> holder,
+ uint32_t key,
+ Handle<FixedArrayBase> backing_store) {
+ if (key >= static_cast<uint32_t>(backing_store->length())) {
+ return false;
+ }
+ return !Handle<BackingStore>::cast(backing_store)->is_the_hole(key);
+ }
+
static bool HasIndexImpl(FixedArrayBase* backing_store, uint32_t index) {
return !BackingStore::cast(backing_store)->is_the_hole(index);
}
}
}
+ static PropertyAttributes GetAttributesImpl(JSObject* obj, uint32_t key,
+ FixedArrayBase* backing_store) {
+ return key < AccessorClass::GetCapacityImpl(obj, backing_store)
+ ? DONT_DELETE
+ : ABSENT;
+ }
+
static PropertyDetails GetDetailsImpl(FixedArrayBase* backing_store,
uint32_t index) {
return PropertyDetails(DONT_DELETE, DATA, 0, PropertyCellType::kNoCell);
// External arrays always ignore deletes.
}
- static uint32_t GetIndexForKeyImpl(JSObject* holder,
- FixedArrayBase* backing_store,
- uint32_t key) {
- return key < AccessorClass::GetCapacityImpl(holder, backing_store)
- ? key
- : kMaxUInt32;
+ static bool HasElementImpl(Handle<JSObject> holder, uint32_t key,
+ Handle<FixedArrayBase> backing_store) {
+ uint32_t capacity = AccessorClass::GetCapacityImpl(*holder, *backing_store);
+ return key < capacity;
}
static uint32_t GetCapacityImpl(JSObject* holder,
return value;
}
+ static PropertyAttributes GetAttributesImpl(JSObject* obj, uint32_t key,
+ FixedArrayBase* backing_store) {
+ SeededNumberDictionary* dictionary =
+ SeededNumberDictionary::cast(backing_store);
+ int entry = dictionary->FindEntry(key);
+ if (entry != SeededNumberDictionary::kNotFound) {
+ return dictionary->DetailsAt(entry).attributes();
+ }
+ return ABSENT;
+ }
+
static MaybeHandle<AccessorPair> GetAccessorPairImpl(
Handle<JSObject> obj, uint32_t key, Handle<FixedArrayBase> store) {
Handle<SeededNumberDictionary> backing_store =
return MaybeHandle<AccessorPair>();
}
+ static bool HasElementImpl(Handle<JSObject> holder, uint32_t key,
+ Handle<FixedArrayBase> store) {
+ Handle<SeededNumberDictionary> backing_store =
+ Handle<SeededNumberDictionary>::cast(store);
+ return backing_store->FindEntry(key) != SeededNumberDictionary::kNotFound;
+ }
+
static bool HasIndexImpl(FixedArrayBase* store, uint32_t index) {
DisallowHeapAllocation no_gc;
SeededNumberDictionary* dict = SeededNumberDictionary::cast(store);
return Smi::cast(key)->value();
}
- static uint32_t GetIndexForKeyImpl(JSObject* holder, FixedArrayBase* store,
- uint32_t key) {
+ static uint32_t GetIndexForKeyImpl(FixedArrayBase* store, uint32_t key) {
DisallowHeapAllocation no_gc;
SeededNumberDictionary* dict = SeededNumberDictionary::cast(store);
int entry = dict->FindEntry(key);
- return entry == SeededNumberDictionary::kNotFound
- ? kMaxUInt32
- : static_cast<uint32_t>(entry);
+ if (entry == SeededNumberDictionary::kNotFound) {
+ return kMaxUInt32;
+ }
+ return static_cast<uint32_t>(entry);
}
static PropertyDetails GetDetailsImpl(FixedArrayBase* backing_store,
->Set(obj, key, arguments, value);
}
+ static PropertyAttributes GetAttributesImpl(JSObject* obj, uint32_t key,
+ FixedArrayBase* backing_store) {
+ FixedArray* parameter_map = FixedArray::cast(backing_store);
+ Object* probe = GetParameterMapArg(parameter_map, key);
+ if (!probe->IsTheHole()) {
+ return NONE;
+ } else {
+ // If not aliased, check the arguments.
+ FixedArray* arguments = FixedArray::cast(parameter_map->get(1));
+ return ElementsAccessor::ForArray(arguments)
+ ->GetAttributes(obj, key, arguments);
+ }
+ }
+
static MaybeHandle<AccessorPair> GetAccessorPairImpl(
Handle<JSObject> obj, uint32_t key, Handle<FixedArrayBase> parameters) {
Handle<FixedArray> parameter_map = Handle<FixedArray>::cast(parameters);
return ForArray(arguments)->GetKeyForIndex(arguments, index - length);
}
- static uint32_t GetIndexForKeyImpl(JSObject* holder,
- FixedArrayBase* parameters, uint32_t key) {
+ static uint32_t GetIndexForKeyImpl(FixedArrayBase* parameters, uint32_t key) {
FixedArray* parameter_map = FixedArray::cast(parameters);
Object* probe = GetParameterMapArg(parameter_map, key);
if (!probe->IsTheHole()) return key;
+ uint32_t length = parameter_map->length() - 2;
FixedArray* arguments = FixedArray::cast(parameter_map->get(1));
- uint32_t index = ElementsAccessor::ForArray(arguments)
- ->GetIndexForKey(holder, arguments, key);
- if (index == kMaxUInt32) return index;
- return (parameter_map->length() - 2) + index;
+ return length +
+ ElementsAccessor::ForArray(arguments)
+ ->GetIndexForKey(arguments, key);
}
static PropertyDetails GetDetailsImpl(FixedArrayBase* parameters,