Index: src/elements.cc |
diff --git a/src/elements.cc b/src/elements.cc |
index 0eee6f520153ca650fedde7269a36148d2939236..3e80d5570b90e46e9de434d8c9f79abaa104721a 100644 |
--- a/src/elements.cc |
+++ b/src/elements.cc |
@@ -115,6 +115,7 @@ |
Object); |
} |
+ |
static void CopyObjectToObjectElements(FixedArrayBase* from_base, |
ElementsKind from_kind, |
uint32_t from_start, |
@@ -585,23 +586,6 @@ |
return 0; |
} |
- virtual Handle<JSArray> Splice(Handle<JSArray> receiver, |
- Handle<FixedArrayBase> backing_store, |
- uint32_t start, uint32_t delete_count, |
- Arguments args, uint32_t add_count) { |
- return ElementsAccessorSubclass::SpliceImpl(receiver, backing_store, start, |
- delete_count, args, add_count); |
- } |
- |
- static Handle<JSArray> SpliceImpl(Handle<JSArray> receiver, |
- Handle<FixedArrayBase> backing_store, |
- uint32_t start, uint32_t delete_count, |
- Arguments args, uint32_t add_count) { |
- UNREACHABLE(); |
- return Handle<JSArray>(); |
- } |
- |
- |
virtual void SetLength(Handle<JSArray> array, uint32_t length) final { |
ElementsAccessorSubclass::SetLengthImpl(array, length, |
handle(array->elements())); |
@@ -613,31 +597,23 @@ |
static Handle<FixedArrayBase> ConvertElementsWithCapacity( |
Handle<JSObject> object, Handle<FixedArrayBase> old_elements, |
ElementsKind from_kind, uint32_t capacity) { |
- return ConvertElementsWithCapacity( |
- object, old_elements, from_kind, capacity, |
+ Isolate* isolate = object->GetIsolate(); |
+ Handle<FixedArrayBase> elements; |
+ if (IsFastDoubleElementsKind(kind())) { |
+ elements = isolate->factory()->NewFixedDoubleArray(capacity); |
+ } else { |
+ elements = isolate->factory()->NewUninitializedFixedArray(capacity); |
+ } |
+ |
+ int packed = kPackedSizeNotKnown; |
+ if (IsFastPackedElementsKind(from_kind) && object->IsJSArray()) { |
+ packed = Smi::cast(JSArray::cast(*object)->length())->value(); |
+ } |
+ |
+ ElementsAccessorSubclass::CopyElementsImpl( |
+ *old_elements, 0, *elements, from_kind, 0, packed, |
ElementsAccessor::kCopyToEndAndInitializeToHole); |
- } |
- |
- static Handle<FixedArrayBase> ConvertElementsWithCapacity( |
- Handle<JSObject> object, Handle<FixedArrayBase> old_elements, |
- ElementsKind from_kind, uint32_t capacity, int copy_size) { |
- Isolate* isolate = object->GetIsolate(); |
- Handle<FixedArrayBase> new_elements; |
- if (IsFastDoubleElementsKind(kind())) { |
- new_elements = isolate->factory()->NewFixedDoubleArray(capacity); |
- } else { |
- new_elements = isolate->factory()->NewUninitializedFixedArray(capacity); |
- } |
- |
- int packed_size = kPackedSizeNotKnown; |
- if (IsFastPackedElementsKind(from_kind) && object->IsJSArray()) { |
- packed_size = Smi::cast(JSArray::cast(*object)->length())->value(); |
- } |
- |
- ElementsAccessorSubclass::CopyElementsImpl( |
- *old_elements, 0, *new_elements, from_kind, 0, packed_size, copy_size); |
- |
- return new_elements; |
+ return elements; |
} |
static void GrowCapacityAndConvertImpl(Handle<JSObject> object, |
@@ -1203,7 +1179,8 @@ |
receiver, backing_store, KindTraits::Kind, capacity); |
} else { |
// push_size is > 0 and new_length <= elms_len, so backing_store cannot be |
- // the empty_fixed_array. |
+ // the |
+ // empty_fixed_array. |
new_elms = backing_store; |
} |
@@ -1226,132 +1203,6 @@ |
receiver->set_length(Smi::FromInt(new_length)); |
return new_length; |
} |
- |
- static void MoveElements(Heap* heap, Handle<FixedArrayBase> backing_store, |
- int dst_index, int src_index, int len, |
- int hole_start, int hole_end) { |
- UNREACHABLE(); |
- } |
- |
- static Handle<JSArray> SpliceImpl(Handle<JSArray> receiver, |
- Handle<FixedArrayBase> backing_store, |
- uint32_t start, uint32_t delete_count, |
- Arguments args, uint32_t add_count) { |
- Isolate* isolate = receiver->GetIsolate(); |
- Heap* heap = isolate->heap(); |
- const uint32_t len = Smi::cast(receiver->length())->value(); |
- const uint32_t new_length = len - delete_count + add_count; |
- |
- if (new_length == 0) { |
- receiver->set_elements(heap->empty_fixed_array()); |
- receiver->set_length(Smi::FromInt(0)); |
- return isolate->factory()->NewJSArrayWithElements( |
- backing_store, KindTraits::Kind, delete_count); |
- } |
- |
- // construct the result array which holds the deleted elements |
- Handle<JSArray> deleted_elements = isolate->factory()->NewJSArray( |
- KindTraits::Kind, delete_count, delete_count); |
- if (delete_count > 0) { |
- DisallowHeapAllocation no_gc; |
- FastElementsAccessorSubclass::CopyElementsImpl( |
- *backing_store, start, deleted_elements->elements(), KindTraits::Kind, |
- 0, kPackedSizeNotKnown, delete_count); |
- } |
- |
- // delete and move elements to make space for add_count new elements |
- bool elms_changed = false; |
- if (add_count < delete_count) { |
- elms_changed = SpliceShrinkStep(backing_store, heap, start, delete_count, |
- add_count, len, new_length); |
- } else if (add_count > delete_count) { |
- elms_changed = |
- SpliceGrowStep(receiver, backing_store, isolate, heap, start, |
- delete_count, add_count, len, new_length); |
- } |
- |
- // Copy new Elements from args |
- if (IsFastDoubleElementsKind(KindTraits::Kind)) { |
- for (uint32_t index = start; index < start + add_count; index++) { |
- Object* arg = args[3 + index - start]; |
- FastElementsAccessorSubclass::SetImpl(*backing_store, index, arg); |
- } |
- } else { |
- // FastSmiOrObjectElementsKind |
- Handle<FixedArray> elms = Handle<FixedArray>::cast(backing_store); |
- DisallowHeapAllocation no_gc; |
- WriteBarrierMode mode = elms->GetWriteBarrierMode(no_gc); |
- for (uint32_t index = start; index < start + add_count; index++) { |
- elms->set(index, args[3 + index - start], mode); |
- } |
- } |
- |
- if (elms_changed) { |
- receiver->set_elements(*backing_store); |
- } |
- receiver->set_length(Smi::FromInt(new_length)); |
- return deleted_elements; |
- } |
- |
- private: |
- static bool SpliceShrinkStep(Handle<FixedArrayBase>& backing_store, |
- Heap* heap, uint32_t start, |
- uint32_t delete_count, uint32_t add_count, |
- uint32_t len, uint32_t new_length) { |
- const int move_left_count = len - delete_count - start; |
- const int move_left_dst_index = start + add_count; |
- const bool left_trim_array = heap->CanMoveObjectStart(*backing_store) && |
- (move_left_dst_index < move_left_count); |
- if (left_trim_array) { |
- const int delta = delete_count - add_count; |
- // shift from before the insertion point to the right |
- FastElementsAccessorSubclass::MoveElements(heap, backing_store, delta, 0, |
- start, 0, 0); |
- backing_store = handle(heap->LeftTrimFixedArray(*backing_store, delta)); |
- return true; |
- } else { |
- // No left-trim needed or possible (in this case we left-move and store |
- // the hole) |
- FastElementsAccessorSubclass::MoveElements( |
- heap, backing_store, move_left_dst_index, start + delete_count, |
- move_left_count, new_length, len); |
- } |
- return false; |
- } |
- |
- |
- static bool SpliceGrowStep(Handle<JSArray> receiver, |
- Handle<FixedArrayBase>& backing_store, |
- Isolate* isolate, Heap* heap, uint32_t start, |
- uint32_t delete_count, uint32_t add_count, |
- uint32_t len, uint32_t new_length) { |
- // Currently fixed arrays cannot grow too big, so |
- // we should never hit this case. |
- DCHECK((add_count - delete_count) <= (Smi::kMaxValue - len)); |
- // Check if backing_store needs to grow. |
- if (new_length > static_cast<uint32_t>(backing_store->length())) { |
- // New backing storage is needed. |
- int capacity = new_length + (new_length >> 1) + 16; |
- // partially copy all elements up to start |
- Handle<FixedArrayBase> new_elms = |
- FastElementsAccessorSubclass::ConvertElementsWithCapacity( |
- receiver, backing_store, KindTraits::Kind, capacity, start); |
- // Copy the trailing elements after start + delete_count |
- FastElementsAccessorSubclass::CopyElementsImpl( |
- *backing_store, start + delete_count, *new_elms, KindTraits::Kind, |
- start + add_count, kPackedSizeNotKnown, |
- ElementsAccessor::kCopyToEndAndInitializeToHole); |
- |
- backing_store = new_elms; |
- return true; |
- } else { |
- DisallowHeapAllocation no_gc; |
- FastElementsAccessorSubclass::MoveElements( |
- heap, backing_store, start + add_count, start + delete_count, |
- (len - delete_count - start), 0, 0); |
- } |
- return false; |
- } |
}; |
@@ -1368,18 +1219,6 @@ |
uint32_t index = FastElementsAccessorSubclass::GetIndexForEntryImpl( |
backing_store, entry); |
return backing_store->get(index); |
- } |
- |
- static void MoveElements(Heap* heap, Handle<FixedArrayBase> backing_store, |
- int dst_index, int src_index, int len, |
- int hole_start, int hole_end) { |
- if (len == 0) return; |
- Handle<FixedArray> dst_elms = Handle<FixedArray>::cast(backing_store); |
- DisallowHeapAllocation no_gc; |
- heap->MoveElements(*dst_elms, dst_index, src_index, len); |
- if (hole_start != hole_end) { |
- dst_elms->FillWithHoles(hole_start, hole_end); |
- } |
} |
// NOTE: this method violates the handlified function signature convention: |
@@ -1481,19 +1320,6 @@ |
explicit FastDoubleElementsAccessor(const char* name) |
: FastElementsAccessor<FastElementsAccessorSubclass, |
KindTraits>(name) {} |
- |
- static void MoveElements(Heap* heap, Handle<FixedArrayBase> backing_store, |
- int dst_index, int src_index, int len, |
- int hole_start, int hole_end) { |
- if (len == 0) return; |
- Handle<FixedDoubleArray> dst_elms = |
- Handle<FixedDoubleArray>::cast(backing_store); |
- MemMove(dst_elms->data_start() + dst_index, |
- dst_elms->data_start() + src_index, len * kDoubleSize); |
- if (hole_start != hole_end) { |
- dst_elms->FillWithHoles(hole_start, hole_end); |
- } |
- } |
static void CopyElementsImpl(FixedArrayBase* from, uint32_t from_start, |
FixedArrayBase* to, ElementsKind from_kind, |