| Index: src/builtins.cc
|
| diff --git a/src/builtins.cc b/src/builtins.cc
|
| index b48de7f2cd52378eb5e706e1951fba1031192c4f..6511c4df78af145fb72d86f0d2f075a0ff16fb42 100644
|
| --- a/src/builtins.cc
|
| +++ b/src/builtins.cc
|
| @@ -367,6 +367,7 @@ static inline Handle<Object> EnsureJSArrayWithWritableFastElementsWrapper(
|
| }
|
|
|
|
|
| +// TODO(ishell): Handlify when all Array* builtins are handlified.
|
| static inline bool IsJSArrayFastElementMovingAllowed(Heap* heap,
|
| JSArray* receiver) {
|
| if (!FLAG_clever_optimizations) return false;
|
| @@ -583,19 +584,19 @@ BUILTIN(ArrayPop) {
|
|
|
|
|
| BUILTIN(ArrayShift) {
|
| + HandleScope scope(isolate);
|
| Heap* heap = isolate->heap();
|
| - Object* receiver = *args.receiver();
|
| - FixedArrayBase* elms_obj;
|
| - MaybeObject* maybe_elms_obj =
|
| - EnsureJSArrayWithWritableFastElements(heap, receiver, NULL, 0);
|
| - if (maybe_elms_obj == NULL)
|
| - return CallJsBuiltin(isolate, "ArrayShift", args);
|
| - if (!maybe_elms_obj->To(&elms_obj)) return maybe_elms_obj;
|
| -
|
| - if (!IsJSArrayFastElementMovingAllowed(heap, JSArray::cast(receiver))) {
|
| + Handle<Object> receiver = args.receiver();
|
| + Handle<Object> elms_or_null =
|
| + EnsureJSArrayWithWritableFastElementsWrapper(isolate, receiver, NULL, 0);
|
| + RETURN_IF_EMPTY_HANDLE(isolate, elms_or_null);
|
| + if ((*elms_or_null == NULL) ||
|
| + !IsJSArrayFastElementMovingAllowed(heap,
|
| + *Handle<JSArray>::cast(receiver))) {
|
| return CallJsBuiltin(isolate, "ArrayShift", args);
|
| }
|
| - JSArray* array = JSArray::cast(receiver);
|
| + Handle<FixedArrayBase> elms_obj = Handle<FixedArrayBase>::cast(elms_or_null);
|
| + Handle<JSArray> array = Handle<JSArray>::cast(receiver);
|
| ASSERT(!array->map()->is_observed());
|
|
|
| int len = Smi::cast(array->length())->value();
|
| @@ -603,25 +604,23 @@ BUILTIN(ArrayShift) {
|
|
|
| // Get first element
|
| ElementsAccessor* accessor = array->GetElementsAccessor();
|
| - Object* first;
|
| - MaybeObject* maybe_first = accessor->Get(receiver, array, 0, elms_obj);
|
| - if (!maybe_first->To(&first)) return maybe_first;
|
| + Handle<Object> first = accessor->Get(receiver, array, 0, elms_obj);
|
| if (first->IsTheHole()) {
|
| - first = heap->undefined_value();
|
| + first = isolate->factory()->undefined_value();
|
| }
|
|
|
| - if (!heap->lo_space()->Contains(elms_obj)) {
|
| - array->set_elements(LeftTrimFixedArray(heap, elms_obj, 1));
|
| + if (!heap->lo_space()->Contains(*elms_obj)) {
|
| + array->set_elements(LeftTrimFixedArray(heap, *elms_obj, 1));
|
| } else {
|
| // Shift the elements.
|
| if (elms_obj->IsFixedArray()) {
|
| - FixedArray* elms = FixedArray::cast(elms_obj);
|
| + Handle<FixedArray> elms = Handle<FixedArray>::cast(elms_obj);
|
| DisallowHeapAllocation no_gc;
|
| - heap->MoveElements(elms, 0, 1, len - 1);
|
| + heap->MoveElements(*elms, 0, 1, len - 1);
|
| elms->set(len - 1, heap->the_hole_value());
|
| } else {
|
| - FixedDoubleArray* elms = FixedDoubleArray::cast(elms_obj);
|
| - MoveDoubleElements(elms, 0, elms, 1, len - 1);
|
| + Handle<FixedDoubleArray> elms = Handle<FixedDoubleArray>::cast(elms_obj);
|
| + MoveDoubleElements(*elms, 0, *elms, 1, len - 1);
|
| elms->set_the_hole(len - 1);
|
| }
|
| }
|
| @@ -629,7 +628,7 @@ BUILTIN(ArrayShift) {
|
| // Set the length.
|
| array->set_length(Smi::FromInt(len - 1));
|
|
|
| - return first;
|
| + return *first;
|
| }
|
|
|
|
|
|
|