Chromium Code Reviews| Index: src/builtins.cc |
| diff --git a/src/builtins.cc b/src/builtins.cc |
| index ed5cf0353c2b2bcf31e3ae241db8b1f4704bc407..f456b8d253565f8308c106b62a5333a486f1ab85 100644 |
| --- a/src/builtins.cc |
| +++ b/src/builtins.cc |
| @@ -294,15 +294,15 @@ static bool ArrayPrototypeHasNoElements(Heap* heap, |
| // Returns empty handle if not applicable. |
| MUST_USE_RESULT |
| -static inline Handle<FixedArrayBase> EnsureJSArrayWithWritableFastElements( |
| +static inline MaybeHandle<FixedArrayBase> EnsureJSArrayWithWritableFastElements( |
| Isolate* isolate, |
| Handle<Object> receiver, |
| Arguments* args, |
| int first_added_arg) { |
| - if (!receiver->IsJSArray()) return Handle<FixedArrayBase>::null(); |
| + if (!receiver->IsJSArray()) return MaybeHandle<FixedArrayBase>(); |
| Handle<JSArray> array = Handle<JSArray>::cast(receiver); |
| - if (array->map()->is_observed()) return Handle<FixedArrayBase>::null(); |
| - if (!array->map()->is_extensible()) return Handle<FixedArrayBase>::null(); |
| + if (array->map()->is_observed()) return MaybeHandle<FixedArrayBase>(); |
| + if (!array->map()->is_extensible()) return MaybeHandle<FixedArrayBase>(); |
| Handle<FixedArrayBase> elms(array->elements(), isolate); |
| Heap* heap = isolate->heap(); |
| Map* map = elms->map(); |
| @@ -314,7 +314,7 @@ static inline Handle<FixedArrayBase> EnsureJSArrayWithWritableFastElements( |
| } else if (map == heap->fixed_double_array_map()) { |
| if (args == NULL) return elms; |
| } else { |
| - return Handle<FixedArrayBase>::null(); |
| + return MaybeHandle<FixedArrayBase>(); |
| } |
| // Need to ensure that the arguments passed in args can be contained in |
| @@ -391,9 +391,12 @@ MUST_USE_RESULT static MaybeObject* CallJsBuiltin( |
| BUILTIN(ArrayPush) { |
| HandleScope scope(isolate); |
| Handle<Object> receiver = args.receiver(); |
| - Handle<FixedArrayBase> elms_obj = |
| + MaybeHandle<FixedArrayBase> maybe_elms_obj = |
| EnsureJSArrayWithWritableFastElements(isolate, receiver, &args, 1); |
| - if (elms_obj.is_null()) return CallJsBuiltin(isolate, "ArrayPush", args); |
| + if (maybe_elms_obj.is_null()) { |
| + return CallJsBuiltin(isolate, "ArrayPush", args); |
| + } |
| + Handle<FixedArrayBase> elms_obj = maybe_elms_obj.ToHandleChecked(); |
|
Yang
2014/04/03 15:04:04
That would be a duplicate check. Why not use ToHan
Igor Sheludko
2014/04/03 15:17:06
Good point, done.
|
| Handle<JSArray> array = Handle<JSArray>::cast(receiver); |
| ASSERT(!array->map()->is_observed()); |
| @@ -496,9 +499,10 @@ BUILTIN(ArrayPush) { |
| BUILTIN(ArrayPop) { |
| HandleScope scope(isolate); |
| Handle<Object> receiver = args.receiver(); |
| - Handle<FixedArrayBase> elms_obj = |
| + MaybeHandle<FixedArrayBase> maybe_elms_obj = |
| EnsureJSArrayWithWritableFastElements(isolate, receiver, NULL, 0); |
| - if (elms_obj.is_null()) return CallJsBuiltin(isolate, "ArrayPop", args); |
| + if (maybe_elms_obj.is_null()) return CallJsBuiltin(isolate, "ArrayPop", args); |
| + Handle<FixedArrayBase> elms_obj = maybe_elms_obj.ToHandleChecked(); |
| Handle<JSArray> array = Handle<JSArray>::cast(receiver); |
| ASSERT(!array->map()->is_observed()); |
| @@ -528,9 +532,9 @@ BUILTIN(ArrayShift) { |
| HandleScope scope(isolate); |
| Heap* heap = isolate->heap(); |
| Handle<Object> receiver = args.receiver(); |
| - Handle<FixedArrayBase> elms_obj = |
| + MaybeHandle<FixedArrayBase> maybe_elms_obj = |
| EnsureJSArrayWithWritableFastElements(isolate, receiver, NULL, 0); |
| - if (elms_obj.is_null() || |
| + if (maybe_elms_obj.is_null() || |
| !IsJSArrayFastElementMovingAllowed(heap, |
| *Handle<JSArray>::cast(receiver))) { |
| return CallJsBuiltin(isolate, "ArrayShift", args); |
| @@ -541,6 +545,8 @@ BUILTIN(ArrayShift) { |
| int len = Smi::cast(array->length())->value(); |
| if (len == 0) return heap->undefined_value(); |
| + Handle<FixedArrayBase> elms_obj = maybe_elms_obj.ToHandleChecked(); |
| + |
| // Get first element |
| ElementsAccessor* accessor = array->GetElementsAccessor(); |
| Handle<Object> first = accessor->Get(receiver, array, 0, elms_obj); |
| @@ -576,9 +582,9 @@ BUILTIN(ArrayUnshift) { |
| HandleScope scope(isolate); |
| Heap* heap = isolate->heap(); |
| Handle<Object> receiver = args.receiver(); |
| - Handle<FixedArrayBase> elms_obj = |
| + MaybeHandle<FixedArrayBase> maybe_elms_obj = |
| EnsureJSArrayWithWritableFastElements(isolate, receiver, NULL, 0); |
| - if (elms_obj.is_null() || |
| + if (maybe_elms_obj.is_null() || |
| !IsJSArrayFastElementMovingAllowed(heap, |
| *Handle<JSArray>::cast(receiver))) { |
| return CallJsBuiltin(isolate, "ArrayUnshift", args); |
| @@ -588,7 +594,8 @@ BUILTIN(ArrayUnshift) { |
| if (!array->HasFastSmiOrObjectElements()) { |
| return CallJsBuiltin(isolate, "ArrayUnshift", args); |
| } |
| - Handle<FixedArray> elms = Handle<FixedArray>::cast(elms_obj); |
| + Handle<FixedArray> elms = |
| + Handle<FixedArray>::cast(maybe_elms_obj.ToHandleChecked()); |
| int len = Smi::cast(array->length())->value(); |
| int to_add = args.length() - 1; |
| @@ -778,9 +785,9 @@ BUILTIN(ArraySplice) { |
| HandleScope scope(isolate); |
| Heap* heap = isolate->heap(); |
| Handle<Object> receiver = args.receiver(); |
| - Handle<FixedArrayBase> elms_obj = |
| + MaybeHandle<FixedArrayBase> maybe_elms_obj = |
| EnsureJSArrayWithWritableFastElements(isolate, receiver, &args, 3); |
| - if (elms_obj.is_null() || |
| + if (maybe_elms_obj.is_null() || |
| !IsJSArrayFastElementMovingAllowed(heap, |
| *Handle<JSArray>::cast(receiver))) { |
| return CallJsBuiltin(isolate, "ArraySplice", args); |
| @@ -847,6 +854,8 @@ BUILTIN(ArraySplice) { |
| return CallJsBuiltin(isolate, "ArraySplice", args); |
| } |
| + Handle<FixedArrayBase> elms_obj = maybe_elms_obj.ToHandleChecked(); |
| + |
| if (new_length == 0) { |
| Handle<JSArray> result = isolate->factory()->NewJSArrayWithElements( |
| elms_obj, elements_kind, actual_delete_count); |