Index: src/elements.cc |
diff --git a/src/elements.cc b/src/elements.cc |
index c8436b5cd684c84b01be76507a7a1bebc79fa1bf..76105599a81bd4bd732d403b671ddfe911ae851c 100644 |
--- a/src/elements.cc |
+++ b/src/elements.cc |
@@ -1603,13 +1603,6 @@ class FastElementsAccessor |
receiver, backing_store, args, unshift_size, AT_START); |
} |
- static void MoveElements(Isolate* isolate, Handle<JSArray> receiver, |
- Handle<FixedArrayBase> backing_store, int dst_index, |
- int src_index, int len, int hole_start, |
- int hole_end) { |
- UNREACHABLE(); |
- } |
- |
static Handle<JSArray> SliceImpl(Handle<JSObject> receiver, |
uint32_t start, uint32_t end) { |
Isolate* isolate = receiver->GetIsolate(); |
@@ -1700,6 +1693,36 @@ class FastElementsAccessor |
return Just(true); |
} |
+ static void MoveElements(Isolate* isolate, Handle<JSArray> receiver, |
+ Handle<FixedArrayBase> backing_store, int dst_index, |
+ int src_index, int len, int hole_start, |
+ int hole_end) { |
+ Heap* heap = isolate->heap(); |
+ Handle<BackingStore> dst_elms = Handle<BackingStore>::cast(backing_store); |
+ if (heap->CanMoveObjectStart(*dst_elms) && dst_index == 0) { |
+ // Update all the copies of this backing_store handle. |
+ *dst_elms.location() = |
+ BackingStore::cast(heap->LeftTrimFixedArray(*dst_elms, src_index)); |
+ receiver->set_elements(*dst_elms); |
+ // Adjust the hole offset as the array has been shrunk. |
+ hole_end -= src_index; |
+ DCHECK_LE(hole_start, backing_store->length()); |
+ DCHECK_LE(hole_end, backing_store->length()); |
+ } else if (len != 0) { |
+ if (IsFastDoubleElementsKind(KindTraits::Kind)) { |
+ MemMove(dst_elms->data_start() + dst_index, |
+ dst_elms->data_start() + src_index, len * kDoubleSize); |
+ } else { |
+ DisallowHeapAllocation no_gc; |
+ heap->MoveElements(FixedArray::cast(*dst_elms), dst_index, src_index, |
+ len); |
+ } |
+ } |
+ if (hole_start != hole_end) { |
+ dst_elms->FillWithHoles(hole_start, hole_end); |
+ } |
+ } |
+ |
private: |
// SpliceShrinkStep might modify the backing_store. |
static void SpliceShrinkStep(Isolate* isolate, Handle<JSArray> receiver, |
@@ -1858,29 +1881,6 @@ class FastSmiOrObjectElementsAccessor |
return backing_store->get(index); |
} |
- static void MoveElements(Isolate* isolate, Handle<JSArray> receiver, |
- Handle<FixedArrayBase> backing_store, int dst_index, |
- int src_index, int len, int hole_start, |
- int hole_end) { |
- Heap* heap = isolate->heap(); |
- Handle<FixedArray> dst_elms = Handle<FixedArray>::cast(backing_store); |
- if (heap->CanMoveObjectStart(*dst_elms) && dst_index == 0) { |
- // Update all the copies of this backing_store handle. |
- *dst_elms.location() = |
- FixedArray::cast(heap->LeftTrimFixedArray(*dst_elms, src_index)); |
- receiver->set_elements(*dst_elms); |
- // Adjust the hole offset as the array has been shrunk. |
- hole_end -= src_index; |
- DCHECK_LE(hole_start, backing_store->length()); |
- DCHECK_LE(hole_end, backing_store->length()); |
- } else if (len != 0) { |
- 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: |
// raw pointer parameters in the function that allocates. |
@@ -2012,31 +2012,6 @@ class FastDoubleElementsAccessor |
FixedDoubleArray::cast(backing_store)->set(entry, value->Number()); |
} |
- static void MoveElements(Isolate* isolate, Handle<JSArray> receiver, |
- Handle<FixedArrayBase> backing_store, int dst_index, |
- int src_index, int len, int hole_start, |
- int hole_end) { |
- Heap* heap = isolate->heap(); |
- Handle<FixedDoubleArray> dst_elms = |
- Handle<FixedDoubleArray>::cast(backing_store); |
- if (heap->CanMoveObjectStart(*dst_elms) && dst_index == 0) { |
- // Update all the copies of this backing_store handle. |
- *dst_elms.location() = FixedDoubleArray::cast( |
- heap->LeftTrimFixedArray(*dst_elms, src_index)); |
- receiver->set_elements(*dst_elms); |
- // Adjust the hole offset as the array has been shrunk. |
- hole_end -= src_index; |
- DCHECK_LE(hole_start, backing_store->length()); |
- DCHECK_LE(hole_end, backing_store->length()); |
- } else if (len != 0) { |
- 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, |
uint32_t to_start, int packed_size, |