Index: src/elements.cc |
diff --git a/src/elements.cc b/src/elements.cc |
index 8cfb01b525c17a0de35438c0e2cae498d00fd78f..2734823852896d9379bcd870f10c32cb263de373 100644 |
--- a/src/elements.cc |
+++ b/src/elements.cc |
@@ -583,10 +583,15 @@ |
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, |
@@ -626,6 +631,20 @@ |
ElementsAccessorSubclass::GetCapacityImpl(*obj, *backing_store)); |
return BackingStore::SetValue( |
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( |
@@ -823,21 +842,14 @@ |
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; |
- } |
- |
- virtual uint32_t GetIndexForKey(JSObject* holder, |
- FixedArrayBase* backing_store, |
+ return key; |
+ } |
+ |
+ 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, |
@@ -980,6 +992,16 @@ |
virtual void Delete(Handle<JSObject> obj, uint32_t key, |
LanguageMode language_mode) final { |
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) { |
@@ -1271,6 +1293,13 @@ |
} |
} |
+ 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); |
@@ -1290,12 +1319,10 @@ |
// 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, |
@@ -1458,6 +1485,17 @@ |
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 = |
@@ -1471,6 +1509,13 @@ |
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); |
@@ -1485,14 +1530,14 @@ |
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, |
@@ -1563,6 +1608,20 @@ |
->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); |
@@ -1647,17 +1706,16 @@ |
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, |