Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index b1d5f1453c1a6aa62e760db7df455dc3a6aa1da2..8e2843597f653a96649174d11b19bdfe48d54e52 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -3207,7 +3207,7 @@ MaybeObject* JSObject::DeleteElement(uint32_t index, DeleteMode mode) { |
case FAST_DOUBLE_ELEMENTS: { |
int length = IsJSArray() |
? Smi::cast(JSArray::cast(this)->length())->value() |
- : FixedArray::cast(elements())->length(); |
+ : FixedDoubleArray::cast(elements())->length(); |
if (index < static_cast<uint32_t>(length)) { |
FixedDoubleArray::cast(elements())->set_the_hole(index); |
} |
@@ -7627,32 +7627,57 @@ MaybeObject* JSObject::SetElementsLength(Object* len) { |
if (maybe_smi_length->ToObject(&smi_length) && smi_length->IsSmi()) { |
const int value = Smi::cast(smi_length)->value(); |
if (value < 0) return ArrayLengthRangeError(GetHeap()); |
- switch (GetElementsKind()) { |
- case FAST_ELEMENTS: { |
- int old_capacity = FixedArray::cast(elements())->length(); |
+ JSObject::ElementsKind elements_kind = GetElementsKind(); |
+ switch (elements_kind) { |
+ case FAST_ELEMENTS: |
+ case FAST_DOUBLE_ELEMENTS: { |
+ int old_capacity = FixedArrayBase::cast(elements())->length(); |
if (value <= old_capacity) { |
if (IsJSArray()) { |
Object* obj; |
- { MaybeObject* maybe_obj = EnsureWritableFastElements(); |
+ if (elements_kind == FAST_ELEMENTS) { |
+ MaybeObject* maybe_obj = EnsureWritableFastElements(); |
if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
} |
- FixedArray* fast_elements = FixedArray::cast(elements()); |
if (2 * value <= old_capacity) { |
// If more than half the elements won't be used, trim the array. |
if (value == 0) { |
initialize_elements(); |
} else { |
- fast_elements->set_length(value); |
- Address filler_start = fast_elements->address() + |
- FixedArray::OffsetOfElementAt(value); |
- int filler_size = (old_capacity - value) * kPointerSize; |
+ Address filler_start; |
+ int filler_size; |
+ if (GetElementsKind() == FAST_ELEMENTS) { |
+ FixedArray* fast_elements = FixedArray::cast(elements()); |
+ fast_elements->set_length(value); |
+ filler_start = fast_elements->address() + |
+ FixedArray::OffsetOfElementAt(value); |
+ filler_size = (old_capacity - value) * kPointerSize; |
+ } else { |
+ ASSERT(GetElementsKind() == FAST_DOUBLE_ELEMENTS); |
+ FixedDoubleArray* fast_double_elements = |
+ FixedDoubleArray::cast(elements()); |
+ fast_double_elements->set_length(value); |
+ filler_start = fast_double_elements->address() + |
+ FixedDoubleArray::OffsetOfElementAt(value); |
+ filler_size = (old_capacity - value) * kDoubleSize; |
+ } |
GetHeap()->CreateFillerObjectAt(filler_start, filler_size); |
} |
} else { |
// Otherwise, fill the unused tail with holes. |
int old_length = FastD2I(JSArray::cast(this)->length()->Number()); |
- for (int i = value; i < old_length; i++) { |
- fast_elements->set_the_hole(i); |
+ if (GetElementsKind() == FAST_ELEMENTS) { |
+ FixedArray* fast_elements = FixedArray::cast(elements()); |
+ for (int i = value; i < old_length; i++) { |
+ fast_elements->set_the_hole(i); |
+ } |
+ } else { |
+ ASSERT(GetElementsKind() == FAST_DOUBLE_ELEMENTS); |
+ FixedDoubleArray* fast_double_elements = |
+ FixedDoubleArray::cast(elements()); |
+ for (int i = value; i < old_length; i++) { |
+ fast_double_elements->set_the_hole(i); |
+ } |
} |
} |
JSArray::cast(this)->set_length(Smi::cast(smi_length)); |
@@ -7663,8 +7688,14 @@ MaybeObject* JSObject::SetElementsLength(Object* len) { |
int new_capacity = value > min ? value : min; |
if (new_capacity <= kMaxFastElementsLength || |
!ShouldConvertToSlowElements(new_capacity)) { |
- MaybeObject* result = |
- SetFastElementsCapacityAndLength(new_capacity, value); |
+ MaybeObject* result; |
+ if (GetElementsKind() == FAST_ELEMENTS) { |
+ result = SetFastElementsCapacityAndLength(new_capacity, value); |
+ } else { |
+ ASSERT(GetElementsKind() == FAST_DOUBLE_ELEMENTS); |
+ result = SetFastDoubleElementsCapacityAndLength(new_capacity, |
+ value); |
+ } |
if (result->IsFailure()) return result; |
return this; |
} |
@@ -7700,7 +7731,6 @@ MaybeObject* JSObject::SetElementsLength(Object* len) { |
case EXTERNAL_FLOAT_ELEMENTS: |
case EXTERNAL_DOUBLE_ELEMENTS: |
case EXTERNAL_PIXEL_ELEMENTS: |
- case FAST_DOUBLE_ELEMENTS: |
UNREACHABLE(); |
break; |
} |