| Index: src/elements.cc
|
| diff --git a/src/elements.cc b/src/elements.cc
|
| index ae5c7de04ac55712be64baf6e69be7b546934b29..79f58735ff2d7b9426f2bed5a280e1bbcd5a6dd1 100644
|
| --- a/src/elements.cc
|
| +++ b/src/elements.cc
|
| @@ -146,33 +146,36 @@ static Failure* ThrowArrayLengthRangeError(Heap* heap) {
|
| }
|
|
|
|
|
| -static void CopyObjectToObjectElements(FixedArray* from,
|
| +static void CopyObjectToObjectElements(FixedArrayBase* from_base,
|
| ElementsKind from_kind,
|
| uint32_t from_start,
|
| - FixedArray* to,
|
| + FixedArrayBase* to_base,
|
| ElementsKind to_kind,
|
| uint32_t to_start,
|
| int raw_copy_size) {
|
| - ASSERT(to->map() != HEAP->fixed_cow_array_map());
|
| + ASSERT(to_base->map() != HEAP->fixed_cow_array_map());
|
| AssertNoAllocation no_allocation;
|
| int copy_size = raw_copy_size;
|
| if (raw_copy_size < 0) {
|
| ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd ||
|
| raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole);
|
| - copy_size = Min(from->length() - from_start,
|
| - to->length() - to_start);
|
| + copy_size = Min(from_base->length() - from_start,
|
| + to_base->length() - to_start);
|
| if (raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole) {
|
| int start = to_start + copy_size;
|
| - int length = to->length() - start;
|
| + int length = to_base->length() - start;
|
| if (length > 0) {
|
| - Heap* heap = from->GetHeap();
|
| - MemsetPointer(to->data_start() + start, heap->the_hole_value(), length);
|
| + Heap* heap = from_base->GetHeap();
|
| + MemsetPointer(FixedArray::cast(to_base)->data_start() + start,
|
| + heap->the_hole_value(), length);
|
| }
|
| }
|
| }
|
| - ASSERT((copy_size + static_cast<int>(to_start)) <= to->length() &&
|
| - (copy_size + static_cast<int>(from_start)) <= from->length());
|
| + ASSERT((copy_size + static_cast<int>(to_start)) <= to_base->length() &&
|
| + (copy_size + static_cast<int>(from_start)) <= from_base->length());
|
| if (copy_size == 0) return;
|
| + FixedArray* from = FixedArray::cast(from_base);
|
| + FixedArray* to = FixedArray::cast(to_base);
|
| ASSERT(IsFastSmiOrObjectElementsKind(from_kind));
|
| ASSERT(IsFastSmiOrObjectElementsKind(to_kind));
|
| Address to_address = to->address() + FixedArray::kHeaderSize;
|
| @@ -193,12 +196,13 @@ static void CopyObjectToObjectElements(FixedArray* from,
|
| }
|
|
|
|
|
| -static void CopyDictionaryToObjectElements(SeededNumberDictionary* from,
|
| +static void CopyDictionaryToObjectElements(FixedArrayBase* from_base,
|
| uint32_t from_start,
|
| - FixedArray* to,
|
| + FixedArrayBase* to_base,
|
| ElementsKind to_kind,
|
| uint32_t to_start,
|
| int raw_copy_size) {
|
| + SeededNumberDictionary* from = SeededNumberDictionary::cast(from_base);
|
| AssertNoAllocation no_allocation;
|
| int copy_size = raw_copy_size;
|
| Heap* heap = from->GetHeap();
|
| @@ -208,16 +212,18 @@ static void CopyDictionaryToObjectElements(SeededNumberDictionary* from,
|
| copy_size = from->max_number_key() + 1 - from_start;
|
| if (raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole) {
|
| int start = to_start + copy_size;
|
| - int length = to->length() - start;
|
| + int length = to_base->length() - start;
|
| if (length > 0) {
|
| Heap* heap = from->GetHeap();
|
| - MemsetPointer(to->data_start() + start, heap->the_hole_value(), length);
|
| + MemsetPointer(FixedArray::cast(to_base)->data_start() + start,
|
| + heap->the_hole_value(), length);
|
| }
|
| }
|
| }
|
| - ASSERT(to != from);
|
| + ASSERT(to_base != from_base);
|
| ASSERT(IsFastSmiOrObjectElementsKind(to_kind));
|
| if (copy_size == 0) return;
|
| + FixedArray* to = FixedArray::cast(to_base);
|
| uint32_t to_length = to->length();
|
| if (to_start + copy_size > to_length) {
|
| copy_size = to_length - to_start;
|
| @@ -244,9 +250,9 @@ static void CopyDictionaryToObjectElements(SeededNumberDictionary* from,
|
|
|
|
|
| MUST_USE_RESULT static MaybeObject* CopyDoubleToObjectElements(
|
| - FixedDoubleArray* from,
|
| + FixedArrayBase* from_base,
|
| uint32_t from_start,
|
| - FixedArray* to,
|
| + FixedArrayBase* to_base,
|
| ElementsKind to_kind,
|
| uint32_t to_start,
|
| int raw_copy_size) {
|
| @@ -255,23 +261,26 @@ MUST_USE_RESULT static MaybeObject* CopyDoubleToObjectElements(
|
| if (raw_copy_size < 0) {
|
| ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd ||
|
| raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole);
|
| - copy_size = Min(from->length() - from_start,
|
| - to->length() - to_start);
|
| + copy_size = Min(from_base->length() - from_start,
|
| + to_base->length() - to_start);
|
| if (raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole) {
|
| // Also initialize the area that will be copied over since HeapNumber
|
| // allocation below can cause an incremental marking step, requiring all
|
| // existing heap objects to be propertly initialized.
|
| int start = to_start;
|
| - int length = to->length() - start;
|
| + int length = to_base->length() - start;
|
| if (length > 0) {
|
| - Heap* heap = from->GetHeap();
|
| - MemsetPointer(to->data_start() + start, heap->the_hole_value(), length);
|
| + Heap* heap = from_base->GetHeap();
|
| + MemsetPointer(FixedArray::cast(to_base)->data_start() + start,
|
| + heap->the_hole_value(), length);
|
| }
|
| }
|
| }
|
| - ASSERT((copy_size + static_cast<int>(to_start)) <= to->length() &&
|
| - (copy_size + static_cast<int>(from_start)) <= from->length());
|
| - if (copy_size == 0) return from;
|
| + ASSERT((copy_size + static_cast<int>(to_start)) <= to_base->length() &&
|
| + (copy_size + static_cast<int>(from_start)) <= from_base->length());
|
| + if (copy_size == 0) return from_base;
|
| + FixedDoubleArray* from = FixedDoubleArray::cast(from_base);
|
| + FixedArray* to = FixedArray::cast(to_base);
|
| for (int i = 0; i < copy_size; ++i) {
|
| if (IsFastSmiElementsKind(to_kind)) {
|
| UNIMPLEMENTED();
|
| @@ -300,26 +309,28 @@ MUST_USE_RESULT static MaybeObject* CopyDoubleToObjectElements(
|
| }
|
|
|
|
|
| -static void CopyDoubleToDoubleElements(FixedDoubleArray* from,
|
| +static void CopyDoubleToDoubleElements(FixedArrayBase* from_base,
|
| uint32_t from_start,
|
| - FixedDoubleArray* to,
|
| + FixedArrayBase* to_base,
|
| uint32_t to_start,
|
| int raw_copy_size) {
|
| int copy_size = raw_copy_size;
|
| if (raw_copy_size < 0) {
|
| ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd ||
|
| raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole);
|
| - copy_size = Min(from->length() - from_start,
|
| - to->length() - to_start);
|
| + copy_size = Min(from_base->length() - from_start,
|
| + to_base->length() - to_start);
|
| if (raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole) {
|
| - for (int i = to_start + copy_size; i < to->length(); ++i) {
|
| - to->set_the_hole(i);
|
| + for (int i = to_start + copy_size; i < to_base->length(); ++i) {
|
| + FixedDoubleArray::cast(to_base)->set_the_hole(i);
|
| }
|
| }
|
| }
|
| - ASSERT((copy_size + static_cast<int>(to_start)) <= to->length() &&
|
| - (copy_size + static_cast<int>(from_start)) <= from->length());
|
| + ASSERT((copy_size + static_cast<int>(to_start)) <= to_base->length() &&
|
| + (copy_size + static_cast<int>(from_start)) <= from_base->length());
|
| if (copy_size == 0) return;
|
| + FixedDoubleArray* from = FixedDoubleArray::cast(from_base);
|
| + FixedDoubleArray* to = FixedDoubleArray::cast(to_base);
|
| Address to_address = to->address() + FixedDoubleArray::kHeaderSize;
|
| Address from_address = from->address() + FixedDoubleArray::kHeaderSize;
|
| to_address += kDoubleSize * to_start;
|
| @@ -331,25 +342,27 @@ static void CopyDoubleToDoubleElements(FixedDoubleArray* from,
|
| }
|
|
|
|
|
| -static void CopySmiToDoubleElements(FixedArray* from,
|
| +static void CopySmiToDoubleElements(FixedArrayBase* from_base,
|
| uint32_t from_start,
|
| - FixedDoubleArray* to,
|
| + FixedArrayBase* to_base,
|
| uint32_t to_start,
|
| int raw_copy_size) {
|
| int copy_size = raw_copy_size;
|
| if (raw_copy_size < 0) {
|
| ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd ||
|
| raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole);
|
| - copy_size = from->length() - from_start;
|
| + copy_size = from_base->length() - from_start;
|
| if (raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole) {
|
| - for (int i = to_start + copy_size; i < to->length(); ++i) {
|
| - to->set_the_hole(i);
|
| + for (int i = to_start + copy_size; i < to_base->length(); ++i) {
|
| + FixedDoubleArray::cast(to_base)->set_the_hole(i);
|
| }
|
| }
|
| }
|
| - ASSERT((copy_size + static_cast<int>(to_start)) <= to->length() &&
|
| - (copy_size + static_cast<int>(from_start)) <= from->length());
|
| + ASSERT((copy_size + static_cast<int>(to_start)) <= to_base->length() &&
|
| + (copy_size + static_cast<int>(from_start)) <= from_base->length());
|
| if (copy_size == 0) return;
|
| + FixedArray* from = FixedArray::cast(from_base);
|
| + FixedDoubleArray* to = FixedDoubleArray::cast(to_base);
|
| Object* the_hole = from->GetHeap()->the_hole_value();
|
| for (uint32_t from_end = from_start + static_cast<uint32_t>(copy_size);
|
| from_start < from_end; from_start++, to_start++) {
|
| @@ -363,9 +376,9 @@ static void CopySmiToDoubleElements(FixedArray* from,
|
| }
|
|
|
|
|
| -static void CopyPackedSmiToDoubleElements(FixedArray* from,
|
| +static void CopyPackedSmiToDoubleElements(FixedArrayBase* from_base,
|
| uint32_t from_start,
|
| - FixedDoubleArray* to,
|
| + FixedArrayBase* to_base,
|
| uint32_t to_start,
|
| int packed_size,
|
| int raw_copy_size) {
|
| @@ -374,11 +387,11 @@ static void CopyPackedSmiToDoubleElements(FixedArray* from,
|
| if (raw_copy_size < 0) {
|
| ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd ||
|
| raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole);
|
| - copy_size = from->length() - from_start;
|
| + copy_size = from_base->length() - from_start;
|
| if (raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole) {
|
| - to_end = to->length();
|
| + to_end = to_base->length();
|
| for (uint32_t i = to_start + copy_size; i < to_end; ++i) {
|
| - to->set_the_hole(i);
|
| + FixedDoubleArray::cast(to_base)->set_the_hole(i);
|
| }
|
| } else {
|
| to_end = to_start + static_cast<uint32_t>(copy_size);
|
| @@ -386,11 +399,13 @@ static void CopyPackedSmiToDoubleElements(FixedArray* from,
|
| } else {
|
| to_end = to_start + static_cast<uint32_t>(copy_size);
|
| }
|
| - ASSERT(static_cast<int>(to_end) <= to->length());
|
| + ASSERT(static_cast<int>(to_end) <= to_base->length());
|
| ASSERT(packed_size >= 0 && packed_size <= copy_size);
|
| - ASSERT((copy_size + static_cast<int>(to_start)) <= to->length() &&
|
| - (copy_size + static_cast<int>(from_start)) <= from->length());
|
| + ASSERT((copy_size + static_cast<int>(to_start)) <= to_base->length() &&
|
| + (copy_size + static_cast<int>(from_start)) <= from_base->length());
|
| if (copy_size == 0) return;
|
| + FixedArray* from = FixedArray::cast(from_base);
|
| + FixedDoubleArray* to = FixedDoubleArray::cast(to_base);
|
| for (uint32_t from_end = from_start + static_cast<uint32_t>(packed_size);
|
| from_start < from_end; from_start++, to_start++) {
|
| Object* smi = from->get(from_start);
|
| @@ -400,25 +415,27 @@ static void CopyPackedSmiToDoubleElements(FixedArray* from,
|
| }
|
|
|
|
|
| -static void CopyObjectToDoubleElements(FixedArray* from,
|
| +static void CopyObjectToDoubleElements(FixedArrayBase* from_base,
|
| uint32_t from_start,
|
| - FixedDoubleArray* to,
|
| + FixedArrayBase* to_base,
|
| uint32_t to_start,
|
| int raw_copy_size) {
|
| int copy_size = raw_copy_size;
|
| if (raw_copy_size < 0) {
|
| ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd ||
|
| raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole);
|
| - copy_size = from->length() - from_start;
|
| + copy_size = from_base->length() - from_start;
|
| if (raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole) {
|
| - for (int i = to_start + copy_size; i < to->length(); ++i) {
|
| - to->set_the_hole(i);
|
| + for (int i = to_start + copy_size; i < to_base->length(); ++i) {
|
| + FixedDoubleArray::cast(to_base)->set_the_hole(i);
|
| }
|
| }
|
| }
|
| - ASSERT((copy_size + static_cast<int>(to_start)) <= to->length() &&
|
| - (copy_size + static_cast<int>(from_start)) <= from->length());
|
| + ASSERT((copy_size + static_cast<int>(to_start)) <= to_base->length() &&
|
| + (copy_size + static_cast<int>(from_start)) <= from_base->length());
|
| if (copy_size == 0) return;
|
| + FixedArray* from = FixedArray::cast(from_base);
|
| + FixedDoubleArray* to = FixedDoubleArray::cast(to_base);
|
| Object* the_hole = from->GetHeap()->the_hole_value();
|
| for (uint32_t from_end = from_start + copy_size;
|
| from_start < from_end; from_start++, to_start++) {
|
| @@ -432,23 +449,25 @@ static void CopyObjectToDoubleElements(FixedArray* from,
|
| }
|
|
|
|
|
| -static void CopyDictionaryToDoubleElements(SeededNumberDictionary* from,
|
| +static void CopyDictionaryToDoubleElements(FixedArrayBase* from_base,
|
| uint32_t from_start,
|
| - FixedDoubleArray* to,
|
| + FixedArrayBase* to_base,
|
| uint32_t to_start,
|
| int raw_copy_size) {
|
| + SeededNumberDictionary* from = SeededNumberDictionary::cast(from_base);
|
| int copy_size = raw_copy_size;
|
| if (copy_size < 0) {
|
| ASSERT(copy_size == ElementsAccessor::kCopyToEnd ||
|
| copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole);
|
| copy_size = from->max_number_key() + 1 - from_start;
|
| if (raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole) {
|
| - for (int i = to_start + copy_size; i < to->length(); ++i) {
|
| - to->set_the_hole(i);
|
| + for (int i = to_start + copy_size; i < to_base->length(); ++i) {
|
| + FixedDoubleArray::cast(to_base)->set_the_hole(i);
|
| }
|
| }
|
| }
|
| if (copy_size == 0) return;
|
| + FixedDoubleArray* to = FixedDoubleArray::cast(to_base);
|
| uint32_t to_length = to->length();
|
| if (to_start + copy_size > to_length) {
|
| copy_size = to_length - to_start;
|
| @@ -541,7 +560,7 @@ class ElementsAccessorBase : public ElementsAccessor {
|
| backing_store = holder->elements();
|
| }
|
| return ElementsAccessorSubclass::HasElementImpl(
|
| - receiver, holder, key, BackingStore::cast(backing_store));
|
| + receiver, holder, key, backing_store);
|
| }
|
|
|
| MUST_USE_RESULT virtual MaybeObject* Get(Object* receiver,
|
| @@ -552,15 +571,15 @@ class ElementsAccessorBase : public ElementsAccessor {
|
| backing_store = holder->elements();
|
| }
|
| return ElementsAccessorSubclass::GetImpl(
|
| - receiver, holder, key, BackingStore::cast(backing_store));
|
| + receiver, holder, key, backing_store);
|
| }
|
|
|
| MUST_USE_RESULT static MaybeObject* GetImpl(Object* receiver,
|
| JSObject* obj,
|
| uint32_t key,
|
| - BackingStore* backing_store) {
|
| + FixedArrayBase* backing_store) {
|
| return (key < ElementsAccessorSubclass::GetCapacityImpl(backing_store))
|
| - ? backing_store->get(key)
|
| + ? BackingStore::cast(backing_store)->get(key)
|
| : backing_store->GetHeap()->the_hole_value();
|
| }
|
|
|
| @@ -596,18 +615,19 @@ class ElementsAccessorBase : public ElementsAccessor {
|
| backing_store = holder->elements();
|
| }
|
| return ElementsAccessorSubclass::GetTypeImpl(
|
| - receiver, holder, key, BackingStore::cast(backing_store));
|
| + receiver, holder, key, backing_store);
|
| }
|
|
|
| MUST_USE_RESULT static PropertyType GetTypeImpl(
|
| Object* receiver,
|
| JSObject* obj,
|
| uint32_t key,
|
| - BackingStore* backing_store) {
|
| + FixedArrayBase* backing_store) {
|
| if (key >= ElementsAccessorSubclass::GetCapacityImpl(backing_store)) {
|
| return NONEXISTENT;
|
| }
|
| - return backing_store->is_the_hole(key) ? NONEXISTENT : FIELD;
|
| + return BackingStore::cast(backing_store)->is_the_hole(key)
|
| + ? NONEXISTENT : FIELD;
|
| }
|
|
|
| MUST_USE_RESULT virtual AccessorPair* GetAccessorPair(
|
| @@ -619,27 +639,27 @@ class ElementsAccessorBase : public ElementsAccessor {
|
| backing_store = holder->elements();
|
| }
|
| return ElementsAccessorSubclass::GetAccessorPairImpl(
|
| - receiver, holder, key, BackingStore::cast(backing_store));
|
| + receiver, holder, key, backing_store);
|
| }
|
|
|
| MUST_USE_RESULT static AccessorPair* GetAccessorPairImpl(
|
| Object* receiver,
|
| JSObject* obj,
|
| uint32_t key,
|
| - BackingStore* backing_store) {
|
| + FixedArrayBase* backing_store) {
|
| return NULL;
|
| }
|
|
|
| MUST_USE_RESULT virtual MaybeObject* SetLength(JSArray* array,
|
| Object* length) {
|
| return ElementsAccessorSubclass::SetLengthImpl(
|
| - array, length, BackingStore::cast(array->elements()));
|
| + array, length, array->elements());
|
| }
|
|
|
| MUST_USE_RESULT static MaybeObject* SetLengthImpl(
|
| JSObject* obj,
|
| Object* length,
|
| - BackingStore* backing_store);
|
| + FixedArrayBase* backing_store);
|
|
|
| MUST_USE_RESULT virtual MaybeObject* SetCapacityAndLength(
|
| JSArray* array,
|
| @@ -717,25 +737,22 @@ class ElementsAccessorBase : public ElementsAccessor {
|
| if (from == NULL) {
|
| from = holder->elements();
|
| }
|
| - BackingStore* backing_store = BackingStore::cast(from);
|
| - uint32_t len1 = ElementsAccessorSubclass::GetCapacityImpl(backing_store);
|
|
|
| // Optimize if 'other' is empty.
|
| // We cannot optimize if 'this' is empty, as other may have holes.
|
| + uint32_t len1 = ElementsAccessorSubclass::GetCapacityImpl(from);
|
| if (len1 == 0) return to;
|
|
|
| // Compute how many elements are not in other.
|
| uint32_t extra = 0;
|
| for (uint32_t y = 0; y < len1; y++) {
|
| - uint32_t key =
|
| - ElementsAccessorSubclass::GetKeyForIndexImpl(backing_store, y);
|
| + uint32_t key = ElementsAccessorSubclass::GetKeyForIndexImpl(from, y);
|
| if (ElementsAccessorSubclass::HasElementImpl(
|
| - receiver, holder, key, backing_store)) {
|
| + receiver, holder, key, from)) {
|
| MaybeObject* maybe_value =
|
| - ElementsAccessorSubclass::GetImpl(receiver, holder,
|
| - key, backing_store);
|
| + ElementsAccessorSubclass::GetImpl(receiver, holder, key, from);
|
| Object* value;
|
| - if (!maybe_value->ToObject(&value)) return maybe_value;
|
| + if (!maybe_value->To(&value)) return maybe_value;
|
| ASSERT(!value->IsTheHole());
|
| if (!HasKey(to, value)) {
|
| extra++;
|
| @@ -747,9 +764,8 @@ class ElementsAccessorBase : public ElementsAccessor {
|
|
|
| // Allocate the result
|
| FixedArray* result;
|
| - MaybeObject* maybe_obj =
|
| - backing_store->GetHeap()->AllocateFixedArray(len0 + extra);
|
| - if (!maybe_obj->To<FixedArray>(&result)) return maybe_obj;
|
| + MaybeObject* maybe_obj = from->GetHeap()->AllocateFixedArray(len0 + extra);
|
| + if (!maybe_obj->To(&result)) return maybe_obj;
|
|
|
| // Fill in the content
|
| {
|
| @@ -765,14 +781,13 @@ class ElementsAccessorBase : public ElementsAccessor {
|
| uint32_t index = 0;
|
| for (uint32_t y = 0; y < len1; y++) {
|
| uint32_t key =
|
| - ElementsAccessorSubclass::GetKeyForIndexImpl(backing_store, y);
|
| + ElementsAccessorSubclass::GetKeyForIndexImpl(from, y);
|
| if (ElementsAccessorSubclass::HasElementImpl(
|
| - receiver, holder, key, backing_store)) {
|
| + receiver, holder, key, from)) {
|
| MaybeObject* maybe_value =
|
| - ElementsAccessorSubclass::GetImpl(receiver, holder,
|
| - key, backing_store);
|
| + ElementsAccessorSubclass::GetImpl(receiver, holder, key, from);
|
| Object* value;
|
| - if (!maybe_value->ToObject(&value)) return maybe_value;
|
| + if (!maybe_value->To(&value)) return maybe_value;
|
| if (!value->IsTheHole() && !HasKey(to, value)) {
|
| result->set(len0 + index, value);
|
| index++;
|
| @@ -792,15 +807,14 @@ class ElementsAccessorBase : public ElementsAccessor {
|
| return ElementsAccessorSubclass::GetCapacityImpl(backing_store);
|
| }
|
|
|
| - static uint32_t GetKeyForIndexImpl(BackingStore* backing_store,
|
| + static uint32_t GetKeyForIndexImpl(FixedArrayBase* backing_store,
|
| uint32_t index) {
|
| return index;
|
| }
|
|
|
| virtual uint32_t GetKeyForIndex(FixedArrayBase* backing_store,
|
| uint32_t index) {
|
| - return ElementsAccessorSubclass::GetKeyForIndexImpl(
|
| - BackingStore::cast(backing_store), index);
|
| + return ElementsAccessorSubclass::GetKeyForIndexImpl(backing_store, index);
|
| }
|
|
|
| private:
|
| @@ -826,7 +840,7 @@ class FastElementsAccessor
|
|
|
| // Adjusts the length of the fast backing store or returns the new length or
|
| // undefined in case conversion to a slow backing store should be performed.
|
| - static MaybeObject* SetLengthWithoutNormalize(BackingStore* backing_store,
|
| + static MaybeObject* SetLengthWithoutNormalize(FixedArrayBase* backing_store,
|
| JSArray* array,
|
| Object* length_object,
|
| uint32_t length) {
|
| @@ -864,7 +878,7 @@ class FastElementsAccessor
|
| // Otherwise, fill the unused tail with holes.
|
| int old_length = FastD2IChecked(array->length()->Number());
|
| for (int i = length; i < old_length; i++) {
|
| - backing_store->set_the_hole(i);
|
| + BackingStore::cast(backing_store)->set_the_hole(i);
|
| }
|
| }
|
| return length_object;
|
| @@ -901,9 +915,8 @@ class FastElementsAccessor
|
| bool is_non_strict_arguments_elements_map =
|
| backing_store->map() == heap->non_strict_arguments_elements_map();
|
| if (is_non_strict_arguments_elements_map) {
|
| - backing_store =
|
| - KindTraits::BackingStore::cast(
|
| - FixedArray::cast(backing_store)->get(1));
|
| + backing_store = KindTraits::BackingStore::cast(
|
| + FixedArray::cast(backing_store)->get(1));
|
| }
|
| uint32_t length = static_cast<uint32_t>(
|
| obj->IsJSArray()
|
| @@ -959,11 +972,11 @@ class FastElementsAccessor
|
| Object* receiver,
|
| JSObject* holder,
|
| uint32_t key,
|
| - typename KindTraits::BackingStore* backing_store) {
|
| + FixedArrayBase* backing_store) {
|
| if (key >= static_cast<uint32_t>(backing_store->length())) {
|
| return false;
|
| }
|
| - return !backing_store->is_the_hole(key);
|
| + return !BackingStore::cast(backing_store)->is_the_hole(key);
|
| }
|
|
|
| static void ValidateContents(JSObject* holder, int length) {
|
| @@ -1011,25 +1024,18 @@ class FastSmiOrObjectElementsAccessor
|
| int copy_size) {
|
| if (IsFastSmiOrObjectElementsKind(to_kind)) {
|
| CopyObjectToObjectElements(
|
| - FixedArray::cast(from), KindTraits::Kind, from_start,
|
| - FixedArray::cast(to), to_kind, to_start, copy_size);
|
| + from, KindTraits::Kind, from_start, to, to_kind, to_start, copy_size);
|
| } else if (IsFastDoubleElementsKind(to_kind)) {
|
| if (IsFastSmiElementsKind(KindTraits::Kind)) {
|
| if (IsFastPackedElementsKind(KindTraits::Kind) &&
|
| packed_size != kPackedSizeNotKnown) {
|
| CopyPackedSmiToDoubleElements(
|
| - FixedArray::cast(from), from_start,
|
| - FixedDoubleArray::castOrEmptyFixedArray(to), to_start,
|
| - packed_size, copy_size);
|
| + from, from_start, to, to_start, packed_size, copy_size);
|
| } else {
|
| - CopySmiToDoubleElements(
|
| - FixedArray::cast(from), from_start,
|
| - FixedDoubleArray::castOrEmptyFixedArray(to), to_start, copy_size);
|
| + CopySmiToDoubleElements(from, from_start, to, to_start, copy_size);
|
| }
|
| } else {
|
| - CopyObjectToDoubleElements(
|
| - FixedArray::cast(from), from_start,
|
| - FixedDoubleArray::castOrEmptyFixedArray(to), to_start, copy_size);
|
| + CopyObjectToDoubleElements(from, from_start, to, to_start, copy_size);
|
| }
|
| } else {
|
| UNREACHABLE();
|
| @@ -1133,13 +1139,10 @@ class FastDoubleElementsAccessor
|
| case FAST_HOLEY_SMI_ELEMENTS:
|
| case FAST_HOLEY_ELEMENTS:
|
| return CopyDoubleToObjectElements(
|
| - FixedDoubleArray::castOrEmptyFixedArray(from), from_start,
|
| - FixedArray::cast(to), to_kind, to_start, copy_size);
|
| + from, from_start, to, to_kind, to_start, copy_size);
|
| case FAST_DOUBLE_ELEMENTS:
|
| case FAST_HOLEY_DOUBLE_ELEMENTS:
|
| - CopyDoubleToDoubleElements(
|
| - FixedDoubleArray::castOrEmptyFixedArray(from), from_start,
|
| - FixedDoubleArray::castOrEmptyFixedArray(to), to_start, copy_size);
|
| + CopyDoubleToDoubleElements(from, from_start, to, to_start, copy_size);
|
| return from;
|
| default:
|
| UNREACHABLE();
|
| @@ -1198,10 +1201,10 @@ class ExternalElementsAccessor
|
| MUST_USE_RESULT static MaybeObject* GetImpl(Object* receiver,
|
| JSObject* obj,
|
| uint32_t key,
|
| - BackingStore* backing_store) {
|
| + FixedArrayBase* backing_store) {
|
| return
|
| key < ExternalElementsAccessorSubclass::GetCapacityImpl(backing_store)
|
| - ? backing_store->get(key)
|
| + ? BackingStore::cast(backing_store)->get(key)
|
| : backing_store->GetHeap()->undefined_value();
|
| }
|
|
|
| @@ -1219,7 +1222,7 @@ class ExternalElementsAccessor
|
| Object* receiver,
|
| JSObject* obj,
|
| uint32_t key,
|
| - BackingStore* backing_store) {
|
| + FixedArrayBase* backing_store) {
|
| return
|
| key < ExternalElementsAccessorSubclass::GetCapacityImpl(backing_store)
|
| ? FIELD : NONEXISTENT;
|
| @@ -1228,7 +1231,7 @@ class ExternalElementsAccessor
|
| MUST_USE_RESULT static MaybeObject* SetLengthImpl(
|
| JSObject* obj,
|
| Object* length,
|
| - BackingStore* backing_store) {
|
| + FixedArrayBase* backing_store) {
|
| // External arrays do not support changing their length.
|
| UNREACHABLE();
|
| return obj;
|
| @@ -1244,7 +1247,7 @@ class ExternalElementsAccessor
|
| static bool HasElementImpl(Object* receiver,
|
| JSObject* holder,
|
| uint32_t key,
|
| - BackingStore* backing_store) {
|
| + FixedArrayBase* backing_store) {
|
| uint32_t capacity =
|
| ExternalElementsAccessorSubclass::GetCapacityImpl(backing_store);
|
| return key < capacity;
|
| @@ -1353,10 +1356,11 @@ class DictionaryElementsAccessor
|
| // Adjusts the length of the dictionary backing store and returns the new
|
| // length according to ES5 section 15.4.5.2 behavior.
|
| MUST_USE_RESULT static MaybeObject* SetLengthWithoutNormalize(
|
| - SeededNumberDictionary* dict,
|
| + FixedArrayBase* store,
|
| JSArray* array,
|
| Object* length_object,
|
| uint32_t length) {
|
| + SeededNumberDictionary* dict = SeededNumberDictionary::cast(store);
|
| Heap* heap = array->GetHeap();
|
| int capacity = dict->Capacity();
|
| uint32_t new_length = length;
|
| @@ -1466,15 +1470,12 @@ class DictionaryElementsAccessor
|
| case FAST_HOLEY_SMI_ELEMENTS:
|
| case FAST_HOLEY_ELEMENTS:
|
| CopyDictionaryToObjectElements(
|
| - SeededNumberDictionary::cast(from), from_start,
|
| - FixedArray::cast(to), to_kind, to_start, copy_size);
|
| + from, from_start, to, to_kind, to_start, copy_size);
|
| return from;
|
| case FAST_DOUBLE_ELEMENTS:
|
| case FAST_HOLEY_DOUBLE_ELEMENTS:
|
| CopyDictionaryToDoubleElements(
|
| - SeededNumberDictionary::cast(from), from_start,
|
| - FixedDoubleArray::castOrEmptyFixedArray(to), to_start,
|
| - copy_size);
|
| + from, from_start, to, to_start, copy_size);
|
| return from;
|
| default:
|
| UNREACHABLE();
|
| @@ -1497,7 +1498,8 @@ class DictionaryElementsAccessor
|
| Object* receiver,
|
| JSObject* obj,
|
| uint32_t key,
|
| - SeededNumberDictionary* backing_store) {
|
| + FixedArrayBase* store) {
|
| + SeededNumberDictionary* backing_store = SeededNumberDictionary::cast(store);
|
| int entry = backing_store->FindEntry(key);
|
| if (entry != SeededNumberDictionary::kNotFound) {
|
| Object* element = backing_store->ValueAt(entry);
|
| @@ -1532,7 +1534,8 @@ class DictionaryElementsAccessor
|
| Object* receiver,
|
| JSObject* obj,
|
| uint32_t key,
|
| - SeededNumberDictionary* backing_store) {
|
| + FixedArrayBase* store) {
|
| + SeededNumberDictionary* backing_store = SeededNumberDictionary::cast(store);
|
| int entry = backing_store->FindEntry(key);
|
| if (entry != SeededNumberDictionary::kNotFound) {
|
| return backing_store->DetailsAt(entry).type();
|
| @@ -1544,7 +1547,8 @@ class DictionaryElementsAccessor
|
| Object* receiver,
|
| JSObject* obj,
|
| uint32_t key,
|
| - BackingStore* backing_store) {
|
| + FixedArrayBase* store) {
|
| + SeededNumberDictionary* backing_store = SeededNumberDictionary::cast(store);
|
| int entry = backing_store->FindEntry(key);
|
| if (entry != SeededNumberDictionary::kNotFound &&
|
| backing_store->DetailsAt(entry).type() == CALLBACKS &&
|
| @@ -1557,13 +1561,14 @@ class DictionaryElementsAccessor
|
| static bool HasElementImpl(Object* receiver,
|
| JSObject* holder,
|
| uint32_t key,
|
| - SeededNumberDictionary* backing_store) {
|
| - return backing_store->FindEntry(key) !=
|
| + FixedArrayBase* backing_store) {
|
| + return SeededNumberDictionary::cast(backing_store)->FindEntry(key) !=
|
| SeededNumberDictionary::kNotFound;
|
| }
|
|
|
| - static uint32_t GetKeyForIndexImpl(SeededNumberDictionary* dict,
|
| + static uint32_t GetKeyForIndexImpl(FixedArrayBase* store,
|
| uint32_t index) {
|
| + SeededNumberDictionary* dict = SeededNumberDictionary::cast(store);
|
| Object* key = dict->KeyAt(index);
|
| return Smi::cast(key)->value();
|
| }
|
| @@ -1586,7 +1591,8 @@ class NonStrictArgumentsElementsAccessor : public ElementsAccessorBase<
|
| MUST_USE_RESULT static MaybeObject* GetImpl(Object* receiver,
|
| JSObject* obj,
|
| uint32_t key,
|
| - FixedArray* parameter_map) {
|
| + FixedArrayBase* parameters) {
|
| + FixedArray* parameter_map = FixedArray::cast(parameters);
|
| Object* probe = GetParameterMapArg(obj, parameter_map, key);
|
| if (!probe->IsTheHole()) {
|
| Context* context = Context::cast(parameter_map->get(0));
|
| @@ -1634,7 +1640,8 @@ class NonStrictArgumentsElementsAccessor : public ElementsAccessorBase<
|
| Object* receiver,
|
| JSObject* obj,
|
| uint32_t key,
|
| - FixedArray* parameter_map) {
|
| + FixedArrayBase* parameters) {
|
| + FixedArray* parameter_map = FixedArray::cast(parameters);
|
| Object* probe = GetParameterMapArg(obj, parameter_map, key);
|
| if (!probe->IsTheHole()) {
|
| return FIELD;
|
| @@ -1650,7 +1657,8 @@ class NonStrictArgumentsElementsAccessor : public ElementsAccessorBase<
|
| Object* receiver,
|
| JSObject* obj,
|
| uint32_t key,
|
| - FixedArray* parameter_map) {
|
| + FixedArrayBase* parameters) {
|
| + FixedArray* parameter_map = FixedArray::cast(parameters);
|
| Object* probe = GetParameterMapArg(obj, parameter_map, key);
|
| if (!probe->IsTheHole()) {
|
| return NULL;
|
| @@ -1665,7 +1673,7 @@ class NonStrictArgumentsElementsAccessor : public ElementsAccessorBase<
|
| MUST_USE_RESULT static MaybeObject* SetLengthImpl(
|
| JSObject* obj,
|
| Object* length,
|
| - FixedArray* parameter_map) {
|
| + FixedArrayBase* parameter_map) {
|
| // TODO(mstarzinger): This was never implemented but will be used once we
|
| // correctly implement [[DefineOwnProperty]] on arrays.
|
| UNIMPLEMENTED();
|
| @@ -1704,7 +1712,7 @@ class NonStrictArgumentsElementsAccessor : public ElementsAccessorBase<
|
| int packed_size,
|
| int copy_size) {
|
| FixedArray* parameter_map = FixedArray::cast(from);
|
| - FixedArray* arguments = FixedArray::cast(parameter_map->get(1));
|
| + FixedArrayBase* arguments = FixedArrayBase::cast(parameter_map->get(1));
|
| ElementsAccessor* accessor = ElementsAccessor::ForArray(arguments);
|
| return accessor->CopyElements(NULL, from_start, to, to_kind,
|
| to_start, copy_size, arguments);
|
| @@ -1717,7 +1725,7 @@ class NonStrictArgumentsElementsAccessor : public ElementsAccessorBase<
|
| ForArray(arguments)->GetCapacity(arguments));
|
| }
|
|
|
| - static uint32_t GetKeyForIndexImpl(FixedArray* dict,
|
| + static uint32_t GetKeyForIndexImpl(FixedArrayBase* dict,
|
| uint32_t index) {
|
| return index;
|
| }
|
| @@ -1725,12 +1733,14 @@ class NonStrictArgumentsElementsAccessor : public ElementsAccessorBase<
|
| static bool HasElementImpl(Object* receiver,
|
| JSObject* holder,
|
| uint32_t key,
|
| - FixedArray* parameter_map) {
|
| + FixedArrayBase* parameters) {
|
| + FixedArray* parameter_map = FixedArray::cast(parameters);
|
| Object* probe = GetParameterMapArg(holder, parameter_map, key);
|
| if (!probe->IsTheHole()) {
|
| return true;
|
| } else {
|
| - FixedArrayBase* arguments = FixedArrayBase::cast(parameter_map->get(1));
|
| + FixedArrayBase* arguments =
|
| + FixedArrayBase::cast(FixedArray::cast(parameter_map)->get(1));
|
| ElementsAccessor* accessor = ElementsAccessor::ForArray(arguments);
|
| return !accessor->Get(receiver, holder, key, arguments)->IsTheHole();
|
| }
|
| @@ -1743,7 +1753,7 @@ class NonStrictArgumentsElementsAccessor : public ElementsAccessorBase<
|
| uint32_t length = holder->IsJSArray()
|
| ? Smi::cast(JSArray::cast(holder)->length())->value()
|
| : parameter_map->length();
|
| - return key < (length - 2 )
|
| + return key < (length - 2)
|
| ? parameter_map->get(key + 2)
|
| : parameter_map->GetHeap()->the_hole_value();
|
| }
|
| @@ -1810,7 +1820,7 @@ MUST_USE_RESULT MaybeObject* ElementsAccessorBase<ElementsAccessorSubclass,
|
| ElementsKindTraits>::
|
| SetLengthImpl(JSObject* obj,
|
| Object* length,
|
| - typename ElementsKindTraits::BackingStore* backing_store) {
|
| + FixedArrayBase* backing_store) {
|
| JSArray* array = JSArray::cast(obj);
|
|
|
| // Fast case: The new length fits into a Smi.
|
|
|