Index: src/builtins.cc |
diff --git a/src/builtins.cc b/src/builtins.cc |
index be9051ce8be6a7258938ee4529f294e0f46f9296..0aecf6b7a2ad098671889fc53e84cbc527e975df 100644 |
--- a/src/builtins.cc |
+++ b/src/builtins.cc |
@@ -825,20 +825,20 @@ BUILTIN(ArraySlice) { |
BUILTIN(ArraySplice) { |
+ HandleScope scope(isolate); |
Heap* heap = isolate->heap(); |
- Object* receiver = *args.receiver(); |
- FixedArrayBase* elms_obj; |
- MaybeObject* maybe_elms = |
- EnsureJSArrayWithWritableFastElements(heap, receiver, &args, 3); |
- if (maybe_elms == NULL) { |
- return CallJsBuiltin(isolate, "ArraySplice", args); |
- } |
- if (!maybe_elms->To(&elms_obj)) return maybe_elms; |
+ Handle<Object> receiver = args.receiver(); |
+ Handle<Object> elms_or_null = |
+ EnsureJSArrayWithWritableFastElementsWrapper(isolate, receiver, &args, 3); |
+ RETURN_IF_EMPTY_HANDLE(isolate, elms_or_null); |
- if (!IsJSArrayFastElementMovingAllowed(heap, JSArray::cast(receiver))) { |
+ if ((*elms_or_null == NULL) || |
+ !IsJSArrayFastElementMovingAllowed(heap, |
+ *Handle<JSArray>::cast(receiver))) { |
return CallJsBuiltin(isolate, "ArraySplice", 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(); |
@@ -847,11 +847,11 @@ BUILTIN(ArraySplice) { |
int relative_start = 0; |
if (n_arguments > 0) { |
- Object* arg1 = args[1]; |
+ Handle<Object> arg1 = args.at<Object>(1); |
if (arg1->IsSmi()) { |
- relative_start = Smi::cast(arg1)->value(); |
+ relative_start = Handle<Smi>::cast(arg1)->value(); |
} else if (arg1->IsHeapNumber()) { |
- double start = HeapNumber::cast(arg1)->value(); |
+ double start = Handle<HeapNumber>::cast(arg1)->value(); |
if (start < kMinInt || start > kMaxInt) { |
return CallJsBuiltin(isolate, "ArraySplice", args); |
} |
@@ -896,72 +896,67 @@ BUILTIN(ArraySplice) { |
} |
if (new_length == 0) { |
- MaybeObject* maybe_array = heap->AllocateJSArrayWithElements( |
+ Handle<JSArray> result = isolate->factory()->NewJSArrayWithElements( |
elms_obj, elements_kind, actual_delete_count); |
- if (maybe_array->IsFailure()) return maybe_array; |
array->set_elements(heap->empty_fixed_array()); |
array->set_length(Smi::FromInt(0)); |
- return maybe_array; |
+ return *result; |
} |
- JSArray* result_array = NULL; |
- MaybeObject* maybe_array = |
- heap->AllocateJSArrayAndStorage(elements_kind, |
- actual_delete_count, |
- actual_delete_count); |
- if (!maybe_array->To(&result_array)) return maybe_array; |
+ Handle<JSArray> result_array = |
+ isolate->factory()->NewJSArray(elements_kind, |
+ actual_delete_count, |
+ actual_delete_count); |
if (actual_delete_count > 0) { |
DisallowHeapAllocation no_gc; |
ElementsAccessor* accessor = array->GetElementsAccessor(); |
- MaybeObject* maybe_failure = accessor->CopyElements( |
- NULL, actual_start, elements_kind, result_array->elements(), |
- 0, actual_delete_count, elms_obj); |
- // Cannot fail since the origin and target array are of the same elements |
- // kind. |
- ASSERT(!maybe_failure->IsFailure()); |
- USE(maybe_failure); |
+ accessor->CopyElements( |
+ Handle<JSObject>::null(), actual_start, elements_kind, |
+ handle(result_array->elements()), 0, actual_delete_count, elms_obj); |
} |
bool elms_changed = false; |
if (item_count < actual_delete_count) { |
// Shrink the array. |
- const bool trim_array = !heap->lo_space()->Contains(elms_obj) && |
+ const bool trim_array = !heap->lo_space()->Contains(*elms_obj) && |
((actual_start + item_count) < |
(len - actual_delete_count - actual_start)); |
if (trim_array) { |
const int delta = actual_delete_count - item_count; |
if (elms_obj->IsFixedDoubleArray()) { |
- FixedDoubleArray* elms = FixedDoubleArray::cast(elms_obj); |
- MoveDoubleElements(elms, delta, elms, 0, actual_start); |
+ Handle<FixedDoubleArray> elms = |
+ Handle<FixedDoubleArray>::cast(elms_obj); |
+ MoveDoubleElements(*elms, delta, *elms, 0, actual_start); |
} else { |
- FixedArray* elms = FixedArray::cast(elms_obj); |
+ Handle<FixedArray> elms = Handle<FixedArray>::cast(elms_obj); |
DisallowHeapAllocation no_gc; |
- heap->MoveElements(elms, delta, 0, actual_start); |
+ heap->MoveElements(*elms, delta, 0, actual_start); |
} |
- elms_obj = LeftTrimFixedArray(heap, elms_obj, delta); |
+ elms_obj = handle(LeftTrimFixedArray(heap, *elms_obj, delta)); |
elms_changed = true; |
} else { |
if (elms_obj->IsFixedDoubleArray()) { |
- FixedDoubleArray* elms = FixedDoubleArray::cast(elms_obj); |
- MoveDoubleElements(elms, actual_start + item_count, |
- elms, actual_start + actual_delete_count, |
+ Handle<FixedDoubleArray> elms = |
+ Handle<FixedDoubleArray>::cast(elms_obj); |
+ MoveDoubleElements(*elms, actual_start + item_count, |
+ *elms, actual_start + actual_delete_count, |
(len - actual_delete_count - actual_start)); |
- FillWithHoles(elms, new_length, len); |
+ FillWithHoles(*elms, new_length, len); |
} else { |
- FixedArray* elms = FixedArray::cast(elms_obj); |
+ Handle<FixedArray> elms = Handle<FixedArray>::cast(elms_obj); |
DisallowHeapAllocation no_gc; |
- heap->MoveElements(elms, actual_start + item_count, |
+ heap->MoveElements(*elms, actual_start + item_count, |
actual_start + actual_delete_count, |
(len - actual_delete_count - actual_start)); |
- FillWithHoles(heap, elms, new_length, len); |
+ FillWithHoles(heap, *elms, new_length, len); |
} |
} |
} else if (item_count > actual_delete_count) { |
- FixedArray* elms = FixedArray::cast(elms_obj); |
+ Handle<FixedArray> elms = Handle<FixedArray>::cast(elms_obj); |
// Currently fixed arrays cannot grow too big, so |
// we should never hit this case. |
ASSERT((item_count - actual_delete_count) <= (Smi::kMaxValue - len)); |
@@ -970,9 +965,8 @@ BUILTIN(ArraySplice) { |
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); |
DisallowHeapAllocation no_gc; |
@@ -980,30 +974,26 @@ BUILTIN(ArraySplice) { |
ElementsAccessor* accessor = array->GetElementsAccessor(); |
if (actual_start > 0) { |
// Copy the part before actual_start as is. |
- MaybeObject* maybe_failure = accessor->CopyElements( |
- NULL, 0, kind, new_elms, 0, actual_start, elms); |
- ASSERT(!maybe_failure->IsFailure()); |
- USE(maybe_failure); |
+ accessor->CopyElements( |
+ Handle<JSObject>::null(), 0, kind, new_elms, 0, actual_start, elms); |
} |
- MaybeObject* maybe_failure = accessor->CopyElements( |
- NULL, actual_start + actual_delete_count, kind, new_elms, |
- actual_start + item_count, |
+ accessor->CopyElements( |
+ Handle<JSObject>::null(), actual_start + actual_delete_count, kind, |
+ new_elms, actual_start + item_count, |
ElementsAccessor::kCopyToEndAndInitializeToHole, elms); |
- ASSERT(!maybe_failure->IsFailure()); |
- USE(maybe_failure); |
elms_obj = new_elms; |
elms_changed = true; |
} else { |
DisallowHeapAllocation no_gc; |
- heap->MoveElements(elms, actual_start + item_count, |
+ heap->MoveElements(*elms, actual_start + item_count, |
actual_start + actual_delete_count, |
(len - actual_delete_count - actual_start)); |
} |
} |
if (IsFastDoubleElementsKind(elements_kind)) { |
- FixedDoubleArray* elms = FixedDoubleArray::cast(elms_obj); |
+ Handle<FixedDoubleArray> elms = Handle<FixedDoubleArray>::cast(elms_obj); |
for (int k = actual_start; k < actual_start + item_count; k++) { |
Object* arg = args[3 + k - actual_start]; |
if (arg->IsSmi()) { |
@@ -1013,7 +1003,7 @@ BUILTIN(ArraySplice) { |
} |
} |
} else { |
- FixedArray* elms = FixedArray::cast(elms_obj); |
+ Handle<FixedArray> elms = Handle<FixedArray>::cast(elms_obj); |
DisallowHeapAllocation no_gc; |
WriteBarrierMode mode = elms->GetWriteBarrierMode(no_gc); |
for (int k = actual_start; k < actual_start + item_count; k++) { |
@@ -1022,12 +1012,12 @@ BUILTIN(ArraySplice) { |
} |
if (elms_changed) { |
- array->set_elements(elms_obj); |
+ array->set_elements(*elms_obj); |
} |
// Set the length. |
array->set_length(Smi::FromInt(new_length)); |
- return result_array; |
+ return *result_array; |
} |