Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index bbbe45a350bd07d3fecbf54c71a2376d202a3e01..c9e498861220efc749d018651acc3712b395a1ff 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -8363,61 +8363,6 @@ MaybeObject* JSObject::SetFastDoubleElementsCapacityAndLength( |
} |
-MaybeObject* JSObject::SetSlowElements(Object* len) { |
- // We should never end in here with a pixel or external array. |
- ASSERT(!HasExternalArrayElements()); |
- |
- uint32_t new_length = static_cast<uint32_t>(len->Number()); |
- |
- FixedArrayBase* old_elements = elements(); |
- ElementsKind elements_kind = GetElementsKind(); |
- switch (elements_kind) { |
- case FAST_SMI_ONLY_ELEMENTS: |
- case FAST_ELEMENTS: |
- case FAST_DOUBLE_ELEMENTS: { |
- // Make sure we never try to shrink dense arrays into sparse arrays. |
- ASSERT(static_cast<uint32_t>(old_elements->length()) <= new_length); |
- MaybeObject* result = NormalizeElements(); |
- if (result->IsFailure()) return result; |
- |
- // Update length for JSArrays. |
- if (IsJSArray()) JSArray::cast(this)->set_length(len); |
- break; |
- } |
- case DICTIONARY_ELEMENTS: { |
- if (IsJSArray()) { |
- uint32_t old_length = |
- static_cast<uint32_t>(JSArray::cast(this)->length()->Number()); |
- element_dictionary()->RemoveNumberEntries(new_length, old_length), |
- JSArray::cast(this)->set_length(len); |
- } |
- break; |
- } |
- case NON_STRICT_ARGUMENTS_ELEMENTS: |
- UNIMPLEMENTED(); |
- break; |
- case EXTERNAL_BYTE_ELEMENTS: |
- case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
- case EXTERNAL_SHORT_ELEMENTS: |
- case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
- case EXTERNAL_INT_ELEMENTS: |
- case EXTERNAL_UNSIGNED_INT_ELEMENTS: |
- case EXTERNAL_FLOAT_ELEMENTS: |
- case EXTERNAL_DOUBLE_ELEMENTS: |
- case EXTERNAL_PIXEL_ELEMENTS: |
- UNREACHABLE(); |
- break; |
- } |
- |
- if (FLAG_trace_elements_transitions) { |
- PrintElementsTransition(stdout, elements_kind, old_elements, |
- DICTIONARY_ELEMENTS, elements()); |
- } |
- |
- return this; |
-} |
- |
- |
MaybeObject* JSArray::Initialize(int capacity) { |
Heap* heap = GetHeap(); |
ASSERT(capacity >= 0); |
@@ -8449,165 +8394,10 @@ void JSArray::Expand(int required_size) { |
} |
-static Failure* ArrayLengthRangeError(Heap* heap) { |
- HandleScope scope(heap->isolate()); |
- return heap->isolate()->Throw( |
- *FACTORY->NewRangeError("invalid_array_length", |
- HandleVector<Object>(NULL, 0))); |
-} |
- |
- |
MaybeObject* JSObject::SetElementsLength(Object* len) { |
// We should never end in here with a pixel or external array. |
ASSERT(AllowsSetElementsLength()); |
- |
- MaybeObject* maybe_smi_length = len->ToSmi(); |
- Object* smi_length = Smi::FromInt(0); |
- if (maybe_smi_length->ToObject(&smi_length) && smi_length->IsSmi()) { |
- const int value = Smi::cast(smi_length)->value(); |
- if (value < 0) return ArrayLengthRangeError(GetHeap()); |
- ElementsKind elements_kind = GetElementsKind(); |
- switch (elements_kind) { |
- case FAST_SMI_ONLY_ELEMENTS: |
- case FAST_ELEMENTS: |
- case FAST_DOUBLE_ELEMENTS: { |
- int old_capacity = FixedArrayBase::cast(elements())->length(); |
- if (value <= old_capacity) { |
- if (IsJSArray()) { |
- Object* obj; |
- if (elements_kind == FAST_ELEMENTS || |
- elements_kind == FAST_SMI_ONLY_ELEMENTS) { |
- MaybeObject* maybe_obj = EnsureWritableFastElements(); |
- if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
- } |
- if (2 * value <= old_capacity) { |
- // If more than half the elements won't be used, trim the array. |
- if (value == 0) { |
- initialize_elements(); |
- } else { |
- Address filler_start; |
- int filler_size; |
- if (elements_kind == FAST_ELEMENTS || |
- elements_kind == FAST_SMI_ONLY_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()); |
- if (elements_kind == FAST_ELEMENTS || |
- elements_kind == FAST_SMI_ONLY_ELEMENTS) { |
- FixedArray* fast_elements = FixedArray::cast(elements()); |
- for (int i = value; i < old_length; i++) { |
- fast_elements->set_the_hole(i); |
- } |
- } else { |
- ASSERT(elements_kind == 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)); |
- } |
- return this; |
- } |
- int min = NewElementsCapacity(old_capacity); |
- int new_capacity = value > min ? value : min; |
- if (!ShouldConvertToSlowElements(new_capacity)) { |
- MaybeObject* result; |
- if (elements_kind == FAST_ELEMENTS || |
- elements_kind == FAST_SMI_ONLY_ELEMENTS) { |
- SetFastElementsCapacityMode set_capacity_mode = |
- elements_kind == FAST_SMI_ONLY_ELEMENTS |
- ? kAllowSmiOnlyElements |
- : kDontAllowSmiOnlyElements; |
- result = SetFastElementsCapacityAndLength(new_capacity, |
- value, |
- set_capacity_mode); |
- } else { |
- ASSERT(elements_kind == FAST_DOUBLE_ELEMENTS); |
- result = SetFastDoubleElementsCapacityAndLength(new_capacity, |
- value); |
- } |
- if (result->IsFailure()) return result; |
- return this; |
- } |
- break; |
- } |
- case DICTIONARY_ELEMENTS: { |
- if (IsJSArray()) { |
- if (value == 0) { |
- // If the length of a slow array is reset to zero, we clear |
- // the array and flush backing storage. This has the added |
- // benefit that the array returns to fast mode. |
- Object* obj; |
- { MaybeObject* maybe_obj = ResetElements(); |
- if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
- } |
- } else { |
- // Remove deleted elements. |
- uint32_t old_length = |
- static_cast<uint32_t>(JSArray::cast(this)->length()->Number()); |
- element_dictionary()->RemoveNumberEntries(value, old_length); |
- } |
- JSArray::cast(this)->set_length(Smi::cast(smi_length)); |
- } |
- return this; |
- } |
- case NON_STRICT_ARGUMENTS_ELEMENTS: |
- case EXTERNAL_BYTE_ELEMENTS: |
- case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
- case EXTERNAL_SHORT_ELEMENTS: |
- case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
- case EXTERNAL_INT_ELEMENTS: |
- case EXTERNAL_UNSIGNED_INT_ELEMENTS: |
- case EXTERNAL_FLOAT_ELEMENTS: |
- case EXTERNAL_DOUBLE_ELEMENTS: |
- case EXTERNAL_PIXEL_ELEMENTS: |
- UNREACHABLE(); |
- break; |
- } |
- } |
- |
- // General slow case. |
- if (len->IsNumber()) { |
- uint32_t length; |
- if (len->ToArrayIndex(&length)) { |
- return SetSlowElements(len); |
- } else { |
- return ArrayLengthRangeError(GetHeap()); |
- } |
- } |
- |
- // len is not a number so make the array size one and |
- // set only element to len. |
- Object* obj; |
- MaybeObject* maybe_obj = GetHeap()->AllocateFixedArray(1); |
- if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
- FixedArray::cast(obj)->set(0, len); |
- |
- maybe_obj = EnsureCanContainElements(&len, 1); |
- if (maybe_obj->IsFailure()) return maybe_obj; |
- |
- if (IsJSArray()) JSArray::cast(this)->set_length(Smi::FromInt(1)); |
- set_elements(FixedArray::cast(obj)); |
- return this; |
+ return GetElementsAccessor()->SetLength(this, len); |
} |
@@ -11978,30 +11768,6 @@ MaybeObject* Dictionary<Shape, Key>::EnsureCapacity(int n, Key key) { |
} |
-void NumberDictionary::RemoveNumberEntries(uint32_t from, uint32_t to) { |
- // Do nothing if the interval [from, to) is empty. |
- if (from >= to) return; |
- |
- Heap* heap = GetHeap(); |
- int removed_entries = 0; |
- Object* sentinel = heap->null_value(); |
- int capacity = Capacity(); |
- for (int i = 0; i < capacity; i++) { |
- Object* key = KeyAt(i); |
- if (key->IsNumber()) { |
- uint32_t number = static_cast<uint32_t>(key->Number()); |
- if (from <= number && number < to) { |
- SetEntry(i, sentinel, sentinel); |
- removed_entries++; |
- } |
- } |
- } |
- |
- // Update the number of elements. |
- ElementsRemoved(removed_entries); |
-} |
- |
- |
template<typename Shape, typename Key> |
Object* Dictionary<Shape, Key>::DeleteProperty(int entry, |
JSReceiver::DeleteMode mode) { |