From 7982072dd39d28d429c1fa3332f9ad37776152c5 Mon Sep 17 00:00:00 2001 From: "ishell@chromium.org" Date: Fri, 4 Apr 2014 08:17:23 +0000 Subject: [PATCH] Maybehandlification of EnsureJSArrayWithWritableFastElements(). R=yangguo@chromium.org Review URL: https://codereview.chromium.org/223743003 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@20498 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/builtins.cc | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/builtins.cc b/src/builtins.cc index ed5cf03..1c6c042 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 EnsureJSArrayWithWritableFastElements( +static inline MaybeHandle EnsureJSArrayWithWritableFastElements( Isolate* isolate, Handle receiver, Arguments* args, int first_added_arg) { - if (!receiver->IsJSArray()) return Handle::null(); + if (!receiver->IsJSArray()) return MaybeHandle(); Handle array = Handle::cast(receiver); - if (array->map()->is_observed()) return Handle::null(); - if (!array->map()->is_extensible()) return Handle::null(); + if (array->map()->is_observed()) return MaybeHandle(); + if (!array->map()->is_extensible()) return MaybeHandle(); Handle elms(array->elements(), isolate); Heap* heap = isolate->heap(); Map* map = elms->map(); @@ -314,7 +314,7 @@ static inline Handle EnsureJSArrayWithWritableFastElements( } else if (map == heap->fixed_double_array_map()) { if (args == NULL) return elms; } else { - return Handle::null(); + return MaybeHandle(); } // 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 receiver = args.receiver(); - Handle elms_obj = + MaybeHandle maybe_elms_obj = EnsureJSArrayWithWritableFastElements(isolate, receiver, &args, 1); - if (elms_obj.is_null()) return CallJsBuiltin(isolate, "ArrayPush", args); + Handle elms_obj; + if (!maybe_elms_obj.ToHandle(&elms_obj)) { + return CallJsBuiltin(isolate, "ArrayPush", args); + } Handle array = Handle::cast(receiver); ASSERT(!array->map()->is_observed()); @@ -496,9 +499,12 @@ BUILTIN(ArrayPush) { BUILTIN(ArrayPop) { HandleScope scope(isolate); Handle receiver = args.receiver(); - Handle elms_obj = + MaybeHandle maybe_elms_obj = EnsureJSArrayWithWritableFastElements(isolate, receiver, NULL, 0); - if (elms_obj.is_null()) return CallJsBuiltin(isolate, "ArrayPop", args); + Handle elms_obj; + if (!maybe_elms_obj.ToHandle(&elms_obj)) { + return CallJsBuiltin(isolate, "ArrayPop", args); + } Handle array = Handle::cast(receiver); ASSERT(!array->map()->is_observed()); @@ -528,9 +534,10 @@ BUILTIN(ArrayShift) { HandleScope scope(isolate); Heap* heap = isolate->heap(); Handle receiver = args.receiver(); - Handle elms_obj = + MaybeHandle maybe_elms_obj = EnsureJSArrayWithWritableFastElements(isolate, receiver, NULL, 0); - if (elms_obj.is_null() || + Handle elms_obj; + if (!maybe_elms_obj.ToHandle(&elms_obj) || !IsJSArrayFastElementMovingAllowed(heap, *Handle::cast(receiver))) { return CallJsBuiltin(isolate, "ArrayShift", args); @@ -576,9 +583,10 @@ BUILTIN(ArrayUnshift) { HandleScope scope(isolate); Heap* heap = isolate->heap(); Handle receiver = args.receiver(); - Handle elms_obj = + MaybeHandle maybe_elms_obj = EnsureJSArrayWithWritableFastElements(isolate, receiver, NULL, 0); - if (elms_obj.is_null() || + Handle elms_obj; + if (!maybe_elms_obj.ToHandle(&elms_obj) || !IsJSArrayFastElementMovingAllowed(heap, *Handle::cast(receiver))) { return CallJsBuiltin(isolate, "ArrayUnshift", args); @@ -778,9 +786,10 @@ BUILTIN(ArraySplice) { HandleScope scope(isolate); Heap* heap = isolate->heap(); Handle receiver = args.receiver(); - Handle elms_obj = + MaybeHandle maybe_elms_obj = EnsureJSArrayWithWritableFastElements(isolate, receiver, &args, 3); - if (elms_obj.is_null() || + Handle elms_obj; + if (!maybe_elms_obj.ToHandle(&elms_obj) || !IsJSArrayFastElementMovingAllowed(heap, *Handle::cast(receiver))) { return CallJsBuiltin(isolate, "ArraySplice", args); -- 2.7.4