| Index: src/elements.cc
|
| diff --git a/src/elements.cc b/src/elements.cc
|
| index 2734823852896d9379bcd870f10c32cb263de373..8cfb01b525c17a0de35438c0e2cae498d00fd78f 100644
|
| --- a/src/elements.cc
|
| +++ b/src/elements.cc
|
| @@ -583,15 +583,10 @@
|
| 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::HasElementImpl(holder, key, backing_store);
|
| + return ElementsAccessorSubclass::GetIndexForKeyImpl(*holder, *backing_store,
|
| + key) != kMaxUInt32;
|
| }
|
|
|
| virtual Handle<Object> Get(Handle<JSObject> holder, uint32_t key,
|
| @@ -631,20 +626,6 @@
|
| 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(
|
| @@ -842,14 +823,21 @@
|
| return ElementsAccessorSubclass::GetKeyForIndexImpl(backing_store, index);
|
| }
|
|
|
| - static uint32_t GetIndexForKeyImpl(FixedArrayBase* backing_store,
|
| + static uint32_t GetIndexForKeyImpl(JSObject* holder,
|
| + FixedArrayBase* backing_store,
|
| uint32_t key) {
|
| - return key;
|
| - }
|
| -
|
| - virtual uint32_t GetIndexForKey(FixedArrayBase* backing_store,
|
| + 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,
|
| uint32_t key) final {
|
| - return ElementsAccessorSubclass::GetIndexForKeyImpl(backing_store, key);
|
| + return ElementsAccessorSubclass::GetIndexForKeyImpl(holder, backing_store,
|
| + key);
|
| }
|
|
|
| static PropertyDetails GetDetailsImpl(FixedArrayBase* backing_store,
|
| @@ -992,16 +980,6 @@
|
| 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) {
|
| @@ -1293,13 +1271,6 @@
|
| }
|
| }
|
|
|
| - 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);
|
| @@ -1319,10 +1290,12 @@
|
| // External arrays always ignore deletes.
|
| }
|
|
|
| - 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 GetIndexForKeyImpl(JSObject* holder,
|
| + FixedArrayBase* backing_store,
|
| + uint32_t key) {
|
| + return key < AccessorClass::GetCapacityImpl(holder, backing_store)
|
| + ? key
|
| + : kMaxUInt32;
|
| }
|
|
|
| static uint32_t GetCapacityImpl(JSObject* holder,
|
| @@ -1485,17 +1458,6 @@
|
| 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 =
|
| @@ -1509,13 +1471,6 @@
|
| 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);
|
| @@ -1530,14 +1485,14 @@
|
| return Smi::cast(key)->value();
|
| }
|
|
|
| - static uint32_t GetIndexForKeyImpl(FixedArrayBase* store, uint32_t key) {
|
| + static uint32_t GetIndexForKeyImpl(JSObject* holder, FixedArrayBase* store,
|
| + uint32_t key) {
|
| DisallowHeapAllocation no_gc;
|
| SeededNumberDictionary* dict = SeededNumberDictionary::cast(store);
|
| int entry = dict->FindEntry(key);
|
| - if (entry == SeededNumberDictionary::kNotFound) {
|
| - return kMaxUInt32;
|
| - }
|
| - return static_cast<uint32_t>(entry);
|
| + return entry == SeededNumberDictionary::kNotFound
|
| + ? kMaxUInt32
|
| + : static_cast<uint32_t>(entry);
|
| }
|
|
|
| static PropertyDetails GetDetailsImpl(FixedArrayBase* backing_store,
|
| @@ -1608,20 +1563,6 @@
|
| ->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);
|
| @@ -1706,16 +1647,17 @@
|
| return ForArray(arguments)->GetKeyForIndex(arguments, index - length);
|
| }
|
|
|
| - static uint32_t GetIndexForKeyImpl(FixedArrayBase* parameters, uint32_t key) {
|
| + static uint32_t GetIndexForKeyImpl(JSObject* holder,
|
| + 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));
|
| - return length +
|
| - ElementsAccessor::ForArray(arguments)
|
| - ->GetIndexForKey(arguments, key);
|
| + uint32_t index = ElementsAccessor::ForArray(arguments)
|
| + ->GetIndexForKey(holder, arguments, key);
|
| + if (index == kMaxUInt32) return index;
|
| + return (parameter_map->length() - 2) + index;
|
| }
|
|
|
| static PropertyDetails GetDetailsImpl(FixedArrayBase* parameters,
|
|
|