| Index: src/builtins.cc
|
| diff --git a/src/builtins.cc b/src/builtins.cc
|
| index b48de7f2cd52378eb5e706e1951fba1031192c4f..6afd4429408d451b658f50c58dc2eadd53f4fffe 100644
|
| --- a/src/builtins.cc
|
| +++ b/src/builtins.cc
|
| @@ -406,23 +406,21 @@ MUST_USE_RESULT static MaybeObject* CallJsBuiltin(
|
|
|
|
|
| BUILTIN(ArrayPush) {
|
| - Heap* heap = isolate->heap();
|
| - Object* receiver = *args.receiver();
|
| - FixedArrayBase* elms_obj;
|
| - MaybeObject* maybe_elms_obj =
|
| - EnsureJSArrayWithWritableFastElements(heap, receiver, &args, 1);
|
| - if (maybe_elms_obj == NULL) {
|
| - return CallJsBuiltin(isolate, "ArrayPush", args);
|
| - }
|
| - if (!maybe_elms_obj->To(&elms_obj)) return maybe_elms_obj;
|
| + HandleScope scope(isolate);
|
| + Handle<Object> receiver = args.receiver();
|
| + Handle<Object> elms_or_null =
|
| + EnsureJSArrayWithWritableFastElementsWrapper(isolate, receiver, &args, 1);
|
| + RETURN_IF_EMPTY_HANDLE(isolate, elms_or_null);
|
| + if (*elms_or_null == NULL) return CallJsBuiltin(isolate, "ArrayPush", 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());
|
|
|
| ElementsKind kind = array->GetElementsKind();
|
|
|
| if (IsFastSmiOrObjectElementsKind(kind)) {
|
| - FixedArray* elms = FixedArray::cast(elms_obj);
|
| + Handle<FixedArray> elms = Handle<FixedArray>::cast(elms_obj);
|
|
|
| int len = Smi::cast(array->length())->value();
|
| int to_add = args.length() - 1;
|
| @@ -438,16 +436,13 @@ BUILTIN(ArrayPush) {
|
| if (new_length > elms->length()) {
|
| // New backing storage is needed.
|
| int capacity = new_length + (new_length >> 1) + 16;
|
| - FixedArray* new_elms;
|
| - MaybeObject* maybe_obj = heap->AllocateUninitializedFixedArray(capacity);
|
| - if (!maybe_obj->To(&new_elms)) return maybe_obj;
|
| + Handle<FixedArray> new_elms =
|
| + isolate->factory()->NewUninitializedFixedArray(capacity);
|
|
|
| ElementsAccessor* accessor = array->GetElementsAccessor();
|
| - MaybeObject* maybe_failure = accessor->CopyElements(
|
| - NULL, 0, kind, new_elms, 0,
|
| - ElementsAccessor::kCopyToEndAndInitializeToHole, elms_obj);
|
| - ASSERT(!maybe_failure->IsFailure());
|
| - USE(maybe_failure);
|
| + accessor->CopyElements(
|
| + Handle<JSObject>::null(), 0, kind, new_elms, 0,
|
| + ElementsAccessor::kCopyToEndAndInitializeToHole, elms_obj);
|
|
|
| elms = new_elms;
|
| }
|
| @@ -459,8 +454,8 @@ BUILTIN(ArrayPush) {
|
| elms->set(index + len, args[index + 1], mode);
|
| }
|
|
|
| - if (elms != array->elements()) {
|
| - array->set_elements(elms);
|
| + if (*elms != array->elements()) {
|
| + array->set_elements(*elms);
|
| }
|
|
|
| // Set the length.
|
| @@ -480,25 +475,22 @@ BUILTIN(ArrayPush) {
|
|
|
| int new_length = len + to_add;
|
|
|
| - FixedDoubleArray* new_elms;
|
| + Handle<FixedDoubleArray> new_elms;
|
|
|
| if (new_length > elms_len) {
|
| // New backing storage is needed.
|
| int capacity = new_length + (new_length >> 1) + 16;
|
| - MaybeObject* maybe_obj =
|
| - heap->AllocateUninitializedFixedDoubleArray(capacity);
|
| - if (!maybe_obj->To(&new_elms)) return maybe_obj;
|
| + new_elms = isolate->factory()->NewFixedDoubleArray(capacity);
|
|
|
| ElementsAccessor* accessor = array->GetElementsAccessor();
|
| - MaybeObject* maybe_failure = accessor->CopyElements(
|
| - NULL, 0, kind, new_elms, 0,
|
| - ElementsAccessor::kCopyToEndAndInitializeToHole, elms_obj);
|
| - ASSERT(!maybe_failure->IsFailure());
|
| - USE(maybe_failure);
|
| + accessor->CopyElements(
|
| + Handle<JSObject>::null(), 0, kind, new_elms, 0,
|
| + ElementsAccessor::kCopyToEndAndInitializeToHole, elms_obj);
|
| +
|
| } else {
|
| // to_add is > 0 and new_length <= elms_len, so elms_obj cannot be the
|
| // empty_fixed_array.
|
| - new_elms = FixedDoubleArray::cast(elms_obj);
|
| + new_elms = Handle<FixedDoubleArray>::cast(elms_obj);
|
| }
|
|
|
| // Add the provided values.
|
| @@ -509,8 +501,8 @@ BUILTIN(ArrayPush) {
|
| new_elms->set(index + len, arg->Number());
|
| }
|
|
|
| - if (new_elms != array->elements()) {
|
| - array->set_elements(new_elms);
|
| + if (*new_elms != array->elements()) {
|
| + array->set_elements(*new_elms);
|
| }
|
|
|
| // Set the length.
|
|
|