Index: src/elements.cc |
diff --git a/src/elements.cc b/src/elements.cc |
index 2692cb53841c354a2c49d2714007746a19bb3f77..d367af85cec392b4fcb2bfcae28434c1049e899c 100644 |
--- a/src/elements.cc |
+++ b/src/elements.cc |
@@ -39,14 +39,8 @@ |
// Inheritance hierarchy: |
// - ElementsAccessorBase (abstract) |
// - FastElementsAccessor (abstract) |
-// - FastSmiOrObjectElementsAccessor |
-// - FastPackedSmiElementsAccessor |
-// - FastHoleySmiElementsAccessor |
-// - FastPackedObjectElementsAccessor |
-// - FastHoleyObjectElementsAccessor |
+// - FastObjectElementsAccessor |
// - FastDoubleElementsAccessor |
-// - FastPackedDoubleElementsAccessor |
-// - FastHoleyDoubleElementsAccessor |
// - ExternalElementsAccessor (abstract) |
// - ExternalByteElementsAccessor |
// - ExternalUnsignedByteElementsAccessor |
@@ -71,15 +65,9 @@ namespace internal { |
// identical. Note that the order must match that of the ElementsKind enum for |
// the |accessor_array[]| below to work. |
#define ELEMENTS_LIST(V) \ |
- V(FastPackedSmiElementsAccessor, FAST_SMI_ELEMENTS, FixedArray) \ |
- V(FastHoleySmiElementsAccessor, FAST_HOLEY_SMI_ELEMENTS, \ |
- FixedArray) \ |
- V(FastPackedObjectElementsAccessor, FAST_ELEMENTS, FixedArray) \ |
- V(FastHoleyObjectElementsAccessor, FAST_HOLEY_ELEMENTS, FixedArray) \ |
- V(FastPackedDoubleElementsAccessor, FAST_DOUBLE_ELEMENTS, \ |
- FixedDoubleArray) \ |
- V(FastHoleyDoubleElementsAccessor, FAST_HOLEY_DOUBLE_ELEMENTS, \ |
- FixedDoubleArray) \ |
+ V(FastObjectElementsAccessor, FAST_SMI_ONLY_ELEMENTS, FixedArray) \ |
+ V(FastObjectElementsAccessor, FAST_ELEMENTS, FixedArray) \ |
+ V(FastDoubleElementsAccessor, FAST_DOUBLE_ELEMENTS, FixedDoubleArray) \ |
V(DictionaryElementsAccessor, DICTIONARY_ELEMENTS, \ |
SeededNumberDictionary) \ |
V(NonStrictArgumentsElementsAccessor, NON_STRICT_ARGUMENTS_ELEMENTS, \ |
@@ -151,6 +139,8 @@ void CopyObjectToObjectElements(FixedArray* from, |
uint32_t to_start, |
int raw_copy_size) { |
ASSERT(to->map() != HEAP->fixed_cow_array_map()); |
+ ASSERT(from_kind == FAST_ELEMENTS || from_kind == FAST_SMI_ONLY_ELEMENTS); |
+ ASSERT(to_kind == FAST_ELEMENTS || to_kind == FAST_SMI_ONLY_ELEMENTS); |
int copy_size = raw_copy_size; |
if (raw_copy_size < 0) { |
ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd || |
@@ -158,7 +148,7 @@ void CopyObjectToObjectElements(FixedArray* from, |
copy_size = Min(from->length() - from_start, |
to->length() - to_start); |
#ifdef DEBUG |
- // FAST_*_ELEMENTS arrays cannot be uninitialized. Ensure they are already |
+ // FAST_ELEMENT arrays cannot be uninitialized. Ensure they are already |
// marked with the hole. |
if (raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole) { |
for (int i = to_start + copy_size; i < to->length(); ++i) { |
@@ -170,15 +160,12 @@ void CopyObjectToObjectElements(FixedArray* from, |
ASSERT((copy_size + static_cast<int>(to_start)) <= to->length() && |
(copy_size + static_cast<int>(from_start)) <= from->length()); |
if (copy_size == 0) return; |
- ASSERT(IsFastSmiOrObjectElementsKind(from_kind)); |
- ASSERT(IsFastSmiOrObjectElementsKind(to_kind)); |
Address to_address = to->address() + FixedArray::kHeaderSize; |
Address from_address = from->address() + FixedArray::kHeaderSize; |
CopyWords(reinterpret_cast<Object**>(to_address) + to_start, |
reinterpret_cast<Object**>(from_address) + from_start, |
copy_size); |
- if (IsFastObjectElementsKind(from_kind) && |
- IsFastObjectElementsKind(to_kind)) { |
+ if (from_kind == FAST_ELEMENTS && to_kind == FAST_ELEMENTS) { |
Heap* heap = from->GetHeap(); |
if (!heap->InNewSpace(to)) { |
heap->RecordWrites(to->address(), |
@@ -203,7 +190,7 @@ static void CopyDictionaryToObjectElements(SeededNumberDictionary* from, |
raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole); |
copy_size = from->max_number_key() + 1 - from_start; |
#ifdef DEBUG |
- // Fast object arrays cannot be uninitialized. Ensure they are already |
+ // FAST_ELEMENT arrays cannot be uninitialized. Ensure they are already |
// marked with the hole. |
if (raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole) { |
for (int i = to_start + copy_size; i < to->length(); ++i) { |
@@ -213,7 +200,7 @@ static void CopyDictionaryToObjectElements(SeededNumberDictionary* from, |
#endif |
} |
ASSERT(to != from); |
- ASSERT(IsFastSmiOrObjectElementsKind(to_kind)); |
+ ASSERT(to_kind == FAST_ELEMENTS || to_kind == FAST_SMI_ONLY_ELEMENTS); |
if (copy_size == 0) return; |
uint32_t to_length = to->length(); |
if (to_start + copy_size > to_length) { |
@@ -229,7 +216,7 @@ static void CopyDictionaryToObjectElements(SeededNumberDictionary* from, |
to->set_the_hole(i + to_start); |
} |
} |
- if (IsFastObjectElementsKind(to_kind)) { |
+ if (to_kind == FAST_ELEMENTS) { |
if (!heap->InNewSpace(to)) { |
heap->RecordWrites(to->address(), |
to->OffsetOfElementAt(to_start), |
@@ -247,7 +234,7 @@ MUST_USE_RESULT static MaybeObject* CopyDoubleToObjectElements( |
ElementsKind to_kind, |
uint32_t to_start, |
int raw_copy_size) { |
- ASSERT(IsFastSmiOrObjectElementsKind(to_kind)); |
+ ASSERT(to_kind == FAST_ELEMENTS || to_kind == FAST_SMI_ONLY_ELEMENTS); |
int copy_size = raw_copy_size; |
if (raw_copy_size < 0) { |
ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd || |
@@ -255,7 +242,7 @@ MUST_USE_RESULT static MaybeObject* CopyDoubleToObjectElements( |
copy_size = Min(from->length() - from_start, |
to->length() - to_start); |
#ifdef DEBUG |
- // FAST_*_ELEMENTS arrays cannot be uninitialized. Ensure they are already |
+ // FAST_ELEMENT arrays cannot be uninitialized. Ensure they are already |
// marked with the hole. |
if (raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole) { |
for (int i = to_start + copy_size; i < to->length(); ++i) { |
@@ -268,14 +255,14 @@ MUST_USE_RESULT static MaybeObject* CopyDoubleToObjectElements( |
(copy_size + static_cast<int>(from_start)) <= from->length()); |
if (copy_size == 0) return from; |
for (int i = 0; i < copy_size; ++i) { |
- if (IsFastSmiElementsKind(to_kind)) { |
+ if (to_kind == FAST_SMI_ONLY_ELEMENTS) { |
UNIMPLEMENTED(); |
return Failure::Exception(); |
} else { |
MaybeObject* maybe_value = from->get(i + from_start); |
Object* value; |
- ASSERT(IsFastObjectElementsKind(to_kind)); |
- // Because Double -> Object elements transitions allocate HeapObjects |
+ ASSERT(to_kind == FAST_ELEMENTS); |
+ // Because FAST_DOUBLE_ELEMENTS -> FAST_ELEMENT allocate HeapObjects |
// iteratively, the allocate must succeed within a single GC cycle, |
// otherwise the retry after the GC will also fail. In order to ensure |
// that no GC is triggered, allocate HeapNumbers from old space if they |
@@ -417,38 +404,6 @@ class ElementsAccessorBase : public ElementsAccessor { |
virtual ElementsKind kind() const { return ElementsTraits::Kind; } |
- static void ValidateContents(JSObject* holder, int length) { |
- } |
- |
- static void ValidateImpl(JSObject* holder) { |
- FixedArrayBase* fixed_array_base = holder->elements(); |
- // When objects are first allocated, its elements are Failures. |
- if (fixed_array_base->IsFailure()) return; |
- if (!fixed_array_base->IsHeapObject()) return; |
- Map* map = fixed_array_base->map(); |
- // Arrays that have been shifted in place can't be verified. |
- Heap* heap = holder->GetHeap(); |
- if (map == heap->raw_unchecked_one_pointer_filler_map() || |
- map == heap->raw_unchecked_two_pointer_filler_map() || |
- map == heap->free_space_map()) { |
- return; |
- } |
- int length = 0; |
- if (holder->IsJSArray()) { |
- Object* length_obj = JSArray::cast(holder)->length(); |
- if (length_obj->IsSmi()) { |
- length = Smi::cast(length_obj)->value(); |
- } |
- } else { |
- length = fixed_array_base->length(); |
- } |
- ElementsAccessorSubclass::ValidateContents(holder, length); |
- } |
- |
- virtual void Validate(JSObject* holder) { |
- ElementsAccessorSubclass::ValidateImpl(holder); |
- } |
- |
static bool HasElementImpl(Object* receiver, |
JSObject* holder, |
uint32_t key, |
@@ -500,10 +455,9 @@ class ElementsAccessorBase : public ElementsAccessor { |
Object* length, |
BackingStore* backing_store); |
- MUST_USE_RESULT virtual MaybeObject* SetCapacityAndLength( |
- JSArray* array, |
- int capacity, |
- int length) { |
+ MUST_USE_RESULT virtual MaybeObject* SetCapacityAndLength(JSArray* array, |
+ int capacity, |
+ int length) { |
return ElementsAccessorSubclass::SetFastElementsCapacityAndLength( |
array, |
capacity, |
@@ -669,7 +623,6 @@ class FastElementsAccessor |
KindTraits>(name) {} |
protected: |
friend class ElementsAccessorBase<FastElementsAccessorSubclass, KindTraits>; |
- friend class NonStrictArgumentsElementsAccessor; |
typedef typename KindTraits::BackingStore BackingStore; |
@@ -680,21 +633,10 @@ class FastElementsAccessor |
Object* length_object, |
uint32_t length) { |
uint32_t old_capacity = backing_store->length(); |
- Object* old_length = array->length(); |
- bool same_size = old_length->IsSmi() && |
- static_cast<uint32_t>(Smi::cast(old_length)->value()) == length; |
- ElementsKind kind = array->GetElementsKind(); |
- |
- if (!same_size && IsFastElementsKind(kind) && |
- !IsFastHoleyElementsKind(kind)) { |
- kind = GetHoleyElementsKind(kind); |
- MaybeObject* maybe_obj = array->TransitionElementsKind(kind); |
- if (maybe_obj->IsFailure()) return maybe_obj; |
- } |
// Check whether the backing store should be shrunk. |
if (length <= old_capacity) { |
- if (array->HasFastSmiOrObjectElements()) { |
+ if (array->HasFastTypeElements()) { |
MaybeObject* maybe_obj = array->EnsureWritableFastElements(); |
if (!maybe_obj->To(&backing_store)) return maybe_obj; |
} |
@@ -726,40 +668,39 @@ class FastElementsAccessor |
MaybeObject* result = FastElementsAccessorSubclass:: |
SetFastElementsCapacityAndLength(array, new_capacity, length); |
if (result->IsFailure()) return result; |
- array->ValidateElements(); |
return length_object; |
} |
// Request conversion to slow elements. |
return array->GetHeap()->undefined_value(); |
} |
+}; |
+ |
+ |
+class FastObjectElementsAccessor |
+ : public FastElementsAccessor<FastObjectElementsAccessor, |
+ ElementsKindTraits<FAST_ELEMENTS>, |
+ kPointerSize> { |
+ public: |
+ explicit FastObjectElementsAccessor(const char* name) |
+ : FastElementsAccessor<FastObjectElementsAccessor, |
+ ElementsKindTraits<FAST_ELEMENTS>, |
+ kPointerSize>(name) {} |
static MaybeObject* DeleteCommon(JSObject* obj, |
- uint32_t key, |
- JSReceiver::DeleteMode mode) { |
- ASSERT(obj->HasFastSmiOrObjectElements() || |
- obj->HasFastDoubleElements() || |
+ uint32_t key) { |
+ ASSERT(obj->HasFastElements() || |
+ obj->HasFastSmiOnlyElements() || |
obj->HasFastArgumentsElements()); |
- typename KindTraits::BackingStore* backing_store = |
- KindTraits::BackingStore::cast(obj->elements()); |
Heap* heap = obj->GetHeap(); |
+ FixedArray* backing_store = FixedArray::cast(obj->elements()); |
if (backing_store->map() == heap->non_strict_arguments_elements_map()) { |
- backing_store = |
- KindTraits::BackingStore::cast( |
- FixedArray::cast(backing_store)->get(1)); |
+ backing_store = FixedArray::cast(backing_store->get(1)); |
} else { |
- ElementsKind kind = KindTraits::Kind; |
- if (IsFastPackedElementsKind(kind)) { |
- MaybeObject* transitioned = |
- obj->TransitionElementsKind(GetHoleyElementsKind(kind)); |
- if (transitioned->IsFailure()) return transitioned; |
- } |
- if (IsFastSmiOrObjectElementsKind(KindTraits::Kind)) { |
- Object* writable; |
- MaybeObject* maybe = obj->EnsureWritableFastElements(); |
- if (!maybe->ToObject(&writable)) return maybe; |
- backing_store = KindTraits::BackingStore::cast(writable); |
- } |
+ Object* writable; |
+ MaybeObject* maybe = obj->EnsureWritableFastElements(); |
+ if (!maybe->ToObject(&writable)) return maybe; |
+ backing_store = FixedArray::cast(writable); |
} |
uint32_t length = static_cast<uint32_t>( |
obj->IsJSArray() |
@@ -771,14 +712,15 @@ class FastElementsAccessor |
// has too few used values, normalize it. |
// To avoid doing the check on every delete we require at least |
// one adjacent hole to the value being deleted. |
+ Object* hole = heap->the_hole_value(); |
const int kMinLengthForSparsenessCheck = 64; |
if (backing_store->length() >= kMinLengthForSparsenessCheck && |
!heap->InNewSpace(backing_store) && |
- ((key > 0 && backing_store->is_the_hole(key - 1)) || |
- (key + 1 < length && backing_store->is_the_hole(key + 1)))) { |
+ ((key > 0 && backing_store->get(key - 1) == hole) || |
+ (key + 1 < length && backing_store->get(key + 1) == hole))) { |
int num_used = 0; |
for (int i = 0; i < backing_store->length(); ++i) { |
- if (!backing_store->is_the_hole(i)) ++num_used; |
+ if (backing_store->get(i) != hole) ++num_used; |
// Bail out early if more than 1/4 is used. |
if (4 * num_used > backing_store->length()) break; |
} |
@@ -791,75 +733,27 @@ class FastElementsAccessor |
return heap->true_value(); |
} |
- virtual MaybeObject* Delete(JSObject* obj, |
- uint32_t key, |
- JSReceiver::DeleteMode mode) { |
- return DeleteCommon(obj, key, mode); |
- } |
- |
- static bool HasElementImpl( |
- Object* receiver, |
- JSObject* holder, |
- uint32_t key, |
- typename KindTraits::BackingStore* backing_store) { |
- if (key >= static_cast<uint32_t>(backing_store->length())) { |
- return false; |
- } |
- return !backing_store->is_the_hole(key); |
- } |
- |
- static void ValidateContents(JSObject* holder, int length) { |
-#if DEBUG |
- FixedArrayBase* elements = holder->elements(); |
- Heap* heap = elements->GetHeap(); |
- Map* map = elements->map(); |
- ASSERT((IsFastSmiOrObjectElementsKind(KindTraits::Kind) && |
- (map == heap->fixed_array_map() || |
- map == heap->fixed_cow_array_map())) || |
- (IsFastDoubleElementsKind(KindTraits::Kind) == |
- ((map == heap->fixed_array_map() && length == 0) || |
- map == heap->fixed_double_array_map()))); |
- for (int i = 0; i < length; i++) { |
- typename KindTraits::BackingStore* backing_store = |
- KindTraits::BackingStore::cast(elements); |
- ASSERT((!IsFastSmiElementsKind(KindTraits::Kind) || |
- static_cast<Object*>(backing_store->get(i))->IsSmi()) || |
- (IsFastHoleyElementsKind(KindTraits::Kind) == |
- backing_store->is_the_hole(i))); |
- } |
-#endif |
- } |
-}; |
- |
- |
-template<typename FastElementsAccessorSubclass, |
- typename KindTraits> |
-class FastSmiOrObjectElementsAccessor |
- : public FastElementsAccessor<FastElementsAccessorSubclass, |
- KindTraits, |
- kPointerSize> { |
- public: |
- explicit FastSmiOrObjectElementsAccessor(const char* name) |
- : FastElementsAccessor<FastElementsAccessorSubclass, |
- KindTraits, |
- kPointerSize>(name) {} |
- |
static MaybeObject* CopyElementsImpl(FixedArrayBase* from, |
uint32_t from_start, |
FixedArrayBase* to, |
ElementsKind to_kind, |
uint32_t to_start, |
int copy_size) { |
- if (IsFastSmiOrObjectElementsKind(to_kind)) { |
- CopyObjectToObjectElements( |
- FixedArray::cast(from), KindTraits::Kind, from_start, |
- FixedArray::cast(to), to_kind, to_start, copy_size); |
- } else if (IsFastDoubleElementsKind(to_kind)) { |
- CopyObjectToDoubleElements( |
- FixedArray::cast(from), from_start, |
- FixedDoubleArray::cast(to), to_start, copy_size); |
- } else { |
- UNREACHABLE(); |
+ switch (to_kind) { |
+ case FAST_SMI_ONLY_ELEMENTS: |
+ case FAST_ELEMENTS: { |
+ CopyObjectToObjectElements( |
+ FixedArray::cast(from), ElementsTraits::Kind, from_start, |
+ FixedArray::cast(to), to_kind, to_start, copy_size); |
+ return from; |
+ } |
+ case FAST_DOUBLE_ELEMENTS: |
+ CopyObjectToDoubleElements( |
+ FixedArray::cast(from), from_start, |
+ FixedDoubleArray::cast(to), to_start, copy_size); |
+ return from; |
+ default: |
+ UNREACHABLE(); |
} |
return to->GetHeap()->undefined_value(); |
} |
@@ -868,85 +762,51 @@ class FastSmiOrObjectElementsAccessor |
static MaybeObject* SetFastElementsCapacityAndLength(JSObject* obj, |
uint32_t capacity, |
uint32_t length) { |
- JSObject::SetFastElementsCapacitySmiMode set_capacity_mode = |
- obj->HasFastSmiElements() |
- ? JSObject::kAllowSmiElements |
- : JSObject::kDontAllowSmiElements; |
+ JSObject::SetFastElementsCapacityMode set_capacity_mode = |
+ obj->HasFastSmiOnlyElements() |
+ ? JSObject::kAllowSmiOnlyElements |
+ : JSObject::kDontAllowSmiOnlyElements; |
return obj->SetFastElementsCapacityAndLength(capacity, |
length, |
set_capacity_mode); |
} |
-}; |
- |
- |
-class FastPackedSmiElementsAccessor |
- : public FastSmiOrObjectElementsAccessor< |
- FastPackedSmiElementsAccessor, |
- ElementsKindTraits<FAST_SMI_ELEMENTS> > { |
- public: |
- explicit FastPackedSmiElementsAccessor(const char* name) |
- : FastSmiOrObjectElementsAccessor< |
- FastPackedSmiElementsAccessor, |
- ElementsKindTraits<FAST_SMI_ELEMENTS> >(name) {} |
-}; |
- |
- |
-class FastHoleySmiElementsAccessor |
- : public FastSmiOrObjectElementsAccessor< |
- FastHoleySmiElementsAccessor, |
- ElementsKindTraits<FAST_HOLEY_SMI_ELEMENTS> > { |
- public: |
- explicit FastHoleySmiElementsAccessor(const char* name) |
- : FastSmiOrObjectElementsAccessor< |
- FastHoleySmiElementsAccessor, |
- ElementsKindTraits<FAST_HOLEY_SMI_ELEMENTS> >(name) {} |
-}; |
- |
- |
-class FastPackedObjectElementsAccessor |
- : public FastSmiOrObjectElementsAccessor< |
- FastPackedObjectElementsAccessor, |
- ElementsKindTraits<FAST_ELEMENTS> > { |
- public: |
- explicit FastPackedObjectElementsAccessor(const char* name) |
- : FastSmiOrObjectElementsAccessor< |
- FastPackedObjectElementsAccessor, |
- ElementsKindTraits<FAST_ELEMENTS> >(name) {} |
-}; |
+ protected: |
+ friend class FastElementsAccessor<FastObjectElementsAccessor, |
+ ElementsKindTraits<FAST_ELEMENTS>, |
+ kPointerSize>; |
-class FastHoleyObjectElementsAccessor |
- : public FastSmiOrObjectElementsAccessor< |
- FastHoleyObjectElementsAccessor, |
- ElementsKindTraits<FAST_HOLEY_ELEMENTS> > { |
- public: |
- explicit FastHoleyObjectElementsAccessor(const char* name) |
- : FastSmiOrObjectElementsAccessor< |
- FastHoleyObjectElementsAccessor, |
- ElementsKindTraits<FAST_HOLEY_ELEMENTS> >(name) {} |
+ virtual MaybeObject* Delete(JSObject* obj, |
+ uint32_t key, |
+ JSReceiver::DeleteMode mode) { |
+ return DeleteCommon(obj, key); |
+ } |
}; |
-template<typename FastElementsAccessorSubclass, |
- typename KindTraits> |
class FastDoubleElementsAccessor |
- : public FastElementsAccessor<FastElementsAccessorSubclass, |
- KindTraits, |
+ : public FastElementsAccessor<FastDoubleElementsAccessor, |
+ ElementsKindTraits<FAST_DOUBLE_ELEMENTS>, |
kDoubleSize> { |
public: |
explicit FastDoubleElementsAccessor(const char* name) |
- : FastElementsAccessor<FastElementsAccessorSubclass, |
- KindTraits, |
+ : FastElementsAccessor<FastDoubleElementsAccessor, |
+ ElementsKindTraits<FAST_DOUBLE_ELEMENTS>, |
kDoubleSize>(name) {} |
static MaybeObject* SetFastElementsCapacityAndLength(JSObject* obj, |
uint32_t capacity, |
uint32_t length) { |
- return obj->SetFastDoubleElementsCapacityAndLength(capacity, |
- length); |
+ return obj->SetFastDoubleElementsCapacityAndLength(capacity, length); |
} |
protected: |
+ friend class ElementsAccessorBase<FastDoubleElementsAccessor, |
+ ElementsKindTraits<FAST_DOUBLE_ELEMENTS> >; |
+ friend class FastElementsAccessor<FastDoubleElementsAccessor, |
+ ElementsKindTraits<FAST_DOUBLE_ELEMENTS>, |
+ kDoubleSize>; |
+ |
static MaybeObject* CopyElementsImpl(FixedArrayBase* from, |
uint32_t from_start, |
FixedArrayBase* to, |
@@ -954,15 +814,12 @@ class FastDoubleElementsAccessor |
uint32_t to_start, |
int copy_size) { |
switch (to_kind) { |
- case FAST_SMI_ELEMENTS: |
+ case FAST_SMI_ONLY_ELEMENTS: |
case FAST_ELEMENTS: |
- case FAST_HOLEY_SMI_ELEMENTS: |
- case FAST_HOLEY_ELEMENTS: |
return CopyDoubleToObjectElements( |
FixedDoubleArray::cast(from), from_start, FixedArray::cast(to), |
to_kind, to_start, copy_size); |
case FAST_DOUBLE_ELEMENTS: |
- case FAST_HOLEY_DOUBLE_ELEMENTS: |
CopyDoubleToDoubleElements(FixedDoubleArray::cast(from), from_start, |
FixedDoubleArray::cast(to), |
to_start, copy_size); |
@@ -972,35 +829,26 @@ class FastDoubleElementsAccessor |
} |
return to->GetHeap()->undefined_value(); |
} |
-}; |
- |
- |
-class FastPackedDoubleElementsAccessor |
- : public FastDoubleElementsAccessor< |
- FastPackedDoubleElementsAccessor, |
- ElementsKindTraits<FAST_DOUBLE_ELEMENTS> > { |
- public: |
- friend class ElementsAccessorBase<FastPackedDoubleElementsAccessor, |
- ElementsKindTraits<FAST_DOUBLE_ELEMENTS> >; |
- explicit FastPackedDoubleElementsAccessor(const char* name) |
- : FastDoubleElementsAccessor< |
- FastPackedDoubleElementsAccessor, |
- ElementsKindTraits<FAST_DOUBLE_ELEMENTS> >(name) {} |
-}; |
+ virtual MaybeObject* Delete(JSObject* obj, |
+ uint32_t key, |
+ JSReceiver::DeleteMode mode) { |
+ int length = obj->IsJSArray() |
+ ? Smi::cast(JSArray::cast(obj)->length())->value() |
+ : FixedDoubleArray::cast(obj->elements())->length(); |
+ if (key < static_cast<uint32_t>(length)) { |
+ FixedDoubleArray::cast(obj->elements())->set_the_hole(key); |
+ } |
+ return obj->GetHeap()->true_value(); |
+ } |
-class FastHoleyDoubleElementsAccessor |
- : public FastDoubleElementsAccessor< |
- FastHoleyDoubleElementsAccessor, |
- ElementsKindTraits<FAST_HOLEY_DOUBLE_ELEMENTS> > { |
- public: |
- friend class ElementsAccessorBase< |
- FastHoleyDoubleElementsAccessor, |
- ElementsKindTraits<FAST_HOLEY_DOUBLE_ELEMENTS> >; |
- explicit FastHoleyDoubleElementsAccessor(const char* name) |
- : FastDoubleElementsAccessor< |
- FastHoleyDoubleElementsAccessor, |
- ElementsKindTraits<FAST_HOLEY_DOUBLE_ELEMENTS> >(name) {} |
+ static bool HasElementImpl(Object* receiver, |
+ JSObject* holder, |
+ uint32_t key, |
+ FixedDoubleArray* backing_store) { |
+ return key < static_cast<uint32_t>(backing_store->length()) && |
+ !backing_store->is_the_hole(key); |
+ } |
}; |
@@ -1267,16 +1115,13 @@ class DictionaryElementsAccessor |
uint32_t to_start, |
int copy_size) { |
switch (to_kind) { |
- case FAST_SMI_ELEMENTS: |
+ case FAST_SMI_ONLY_ELEMENTS: |
case FAST_ELEMENTS: |
- case FAST_HOLEY_SMI_ELEMENTS: |
- case FAST_HOLEY_ELEMENTS: |
CopyDictionaryToObjectElements( |
SeededNumberDictionary::cast(from), from_start, |
FixedArray::cast(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::cast(to), to_start, copy_size); |
@@ -1403,10 +1248,7 @@ class NonStrictArgumentsElementsAccessor : public ElementsAccessorBase< |
if (arguments->IsDictionary()) { |
return DictionaryElementsAccessor::DeleteCommon(obj, key, 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, mode); |
+ return FastObjectElementsAccessor::DeleteCommon(obj, key); |
} |
} |
return obj->GetHeap()->true_value(); |
@@ -1470,7 +1312,7 @@ ElementsAccessor* ElementsAccessor::ForArray(FixedArrayBase* array) { |
if (array->IsDictionary()) { |
return elements_accessors_[DICTIONARY_ELEMENTS]; |
} else { |
- return elements_accessors_[FAST_HOLEY_ELEMENTS]; |
+ return elements_accessors_[FAST_ELEMENTS]; |
} |
case EXTERNAL_BYTE_ARRAY_TYPE: |
return elements_accessors_[EXTERNAL_BYTE_ELEMENTS]; |