| Index: src/elements.cc
|
| diff --git a/src/elements.cc b/src/elements.cc
|
| index 921c371e34b27d9dd0397f14eb614cd1d9c109f8..d17efafcebb2c6c88e585381ffda311db20d63bc 100644
|
| --- a/src/elements.cc
|
| +++ b/src/elements.cc
|
| @@ -515,8 +515,33 @@ class ElementsAccessorBase : public ElementsAccessor {
|
| ElementsAccessorSubclass::ValidateImpl(holder);
|
| }
|
|
|
| + virtual bool IsPacked(Handle<JSObject> holder,
|
| + Handle<FixedArrayBase> backing_store, uint32_t start,
|
| + uint32_t end) final {
|
| + return ElementsAccessorSubclass::IsPackedImpl(holder, backing_store, start,
|
| + end);
|
| + }
|
| +
|
| + static bool IsPackedImpl(Handle<JSObject> holder,
|
| + Handle<FixedArrayBase> backing_store, uint32_t start,
|
| + uint32_t end) {
|
| + if (IsFastPackedElementsKind(kind())) return true;
|
| + for (uint32_t i = start; i < end; i++) {
|
| + if (!ElementsAccessorSubclass::HasElementImpl(holder, i, backing_store)) {
|
| + return false;
|
| + }
|
| + }
|
| + return true;
|
| + }
|
| +
|
| virtual bool HasElement(Handle<JSObject> holder, uint32_t index,
|
| Handle<FixedArrayBase> backing_store) final {
|
| + return ElementsAccessorSubclass::HasElementImpl(holder, index,
|
| + backing_store);
|
| + }
|
| +
|
| + static bool HasElementImpl(Handle<JSObject> holder, uint32_t index,
|
| + Handle<FixedArrayBase> backing_store) {
|
| return ElementsAccessorSubclass::GetEntryForIndexImpl(
|
| *holder, *backing_store, index) != kMaxUInt32;
|
| }
|
| @@ -572,7 +597,7 @@ class ElementsAccessorBase : public ElementsAccessor {
|
|
|
| virtual uint32_t Push(Handle<JSArray> receiver,
|
| Handle<FixedArrayBase> backing_store, Object** objects,
|
| - uint32_t push_size, int direction) {
|
| + uint32_t push_size, int direction) final {
|
| return ElementsAccessorSubclass::PushImpl(receiver, backing_store, objects,
|
| push_size, direction);
|
| }
|
| @@ -584,10 +609,24 @@ class ElementsAccessorBase : public ElementsAccessor {
|
| return 0;
|
| }
|
|
|
| + virtual Handle<JSArray> Slice(Handle<JSObject> receiver,
|
| + Handle<FixedArrayBase> backing_store,
|
| + uint32_t start, uint32_t end) final {
|
| + return ElementsAccessorSubclass::SliceImpl(receiver, backing_store, start,
|
| + end);
|
| + }
|
| +
|
| + static Handle<JSArray> SliceImpl(Handle<JSObject> receiver,
|
| + Handle<FixedArrayBase> backing_store,
|
| + uint32_t start, uint32_t end) {
|
| + UNREACHABLE();
|
| + return Handle<JSArray>();
|
| + }
|
| +
|
| virtual Handle<JSArray> Splice(Handle<JSArray> receiver,
|
| Handle<FixedArrayBase> backing_store,
|
| uint32_t start, uint32_t delete_count,
|
| - Arguments args, uint32_t add_count) {
|
| + Arguments args, uint32_t add_count) final {
|
| return ElementsAccessorSubclass::SpliceImpl(receiver, backing_store, start,
|
| delete_count, args, add_count);
|
| }
|
| @@ -1232,14 +1271,31 @@ class FastElementsAccessor
|
| UNREACHABLE();
|
| }
|
|
|
| + static Handle<JSArray> SliceImpl(Handle<JSObject> receiver,
|
| + Handle<FixedArrayBase> backing_store,
|
| + uint32_t start, uint32_t end) {
|
| + Isolate* isolate = receiver->GetIsolate();
|
| + if (end <= start) {
|
| + return isolate->factory()->NewJSArray(KindTraits::Kind, 0, 0);
|
| + }
|
| + int result_len = end - start;
|
| + Handle<JSArray> result_array = isolate->factory()->NewJSArray(
|
| + KindTraits::Kind, result_len, result_len);
|
| + DisallowHeapAllocation no_gc;
|
| + FastElementsAccessorSubclass::CopyElementsImpl(
|
| + *backing_store, start, result_array->elements(), KindTraits::Kind, 0,
|
| + kPackedSizeNotKnown, result_len);
|
| + return result_array;
|
| + }
|
| +
|
| 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;
|
| + uint32_t len = Smi::cast(receiver->length())->value();
|
| + uint32_t new_length = len - delete_count + add_count;
|
|
|
| if (new_length == 0) {
|
| receiver->set_elements(heap->empty_fixed_array());
|
|
|