| 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) {
|
|
|