Commit 7982072d authored by ishell@chromium.org's avatar ishell@chromium.org

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
parent 4b222fb6
...@@ -294,15 +294,15 @@ static bool ArrayPrototypeHasNoElements(Heap* heap, ...@@ -294,15 +294,15 @@ static bool ArrayPrototypeHasNoElements(Heap* heap,
// Returns empty handle if not applicable. // Returns empty handle if not applicable.
MUST_USE_RESULT MUST_USE_RESULT
static inline Handle<FixedArrayBase> EnsureJSArrayWithWritableFastElements( static inline MaybeHandle<FixedArrayBase> EnsureJSArrayWithWritableFastElements(
Isolate* isolate, Isolate* isolate,
Handle<Object> receiver, Handle<Object> receiver,
Arguments* args, Arguments* args,
int first_added_arg) { int first_added_arg) {
if (!receiver->IsJSArray()) return Handle<FixedArrayBase>::null(); if (!receiver->IsJSArray()) return MaybeHandle<FixedArrayBase>();
Handle<JSArray> array = Handle<JSArray>::cast(receiver); Handle<JSArray> array = Handle<JSArray>::cast(receiver);
if (array->map()->is_observed()) return Handle<FixedArrayBase>::null(); if (array->map()->is_observed()) return MaybeHandle<FixedArrayBase>();
if (!array->map()->is_extensible()) return Handle<FixedArrayBase>::null(); if (!array->map()->is_extensible()) return MaybeHandle<FixedArrayBase>();
Handle<FixedArrayBase> elms(array->elements(), isolate); Handle<FixedArrayBase> elms(array->elements(), isolate);
Heap* heap = isolate->heap(); Heap* heap = isolate->heap();
Map* map = elms->map(); Map* map = elms->map();
...@@ -314,7 +314,7 @@ static inline Handle<FixedArrayBase> EnsureJSArrayWithWritableFastElements( ...@@ -314,7 +314,7 @@ static inline Handle<FixedArrayBase> EnsureJSArrayWithWritableFastElements(
} else if (map == heap->fixed_double_array_map()) { } else if (map == heap->fixed_double_array_map()) {
if (args == NULL) return elms; if (args == NULL) return elms;
} else { } else {
return Handle<FixedArrayBase>::null(); return MaybeHandle<FixedArrayBase>();
} }
// Need to ensure that the arguments passed in args can be contained in // Need to ensure that the arguments passed in args can be contained in
...@@ -391,9 +391,12 @@ MUST_USE_RESULT static MaybeObject* CallJsBuiltin( ...@@ -391,9 +391,12 @@ MUST_USE_RESULT static MaybeObject* CallJsBuiltin(
BUILTIN(ArrayPush) { BUILTIN(ArrayPush) {
HandleScope scope(isolate); HandleScope scope(isolate);
Handle<Object> receiver = args.receiver(); Handle<Object> receiver = args.receiver();
Handle<FixedArrayBase> elms_obj = MaybeHandle<FixedArrayBase> maybe_elms_obj =
EnsureJSArrayWithWritableFastElements(isolate, receiver, &args, 1); EnsureJSArrayWithWritableFastElements(isolate, receiver, &args, 1);
if (elms_obj.is_null()) return CallJsBuiltin(isolate, "ArrayPush", args); Handle<FixedArrayBase> elms_obj;
if (!maybe_elms_obj.ToHandle(&elms_obj)) {
return CallJsBuiltin(isolate, "ArrayPush", args);
}
Handle<JSArray> array = Handle<JSArray>::cast(receiver); Handle<JSArray> array = Handle<JSArray>::cast(receiver);
ASSERT(!array->map()->is_observed()); ASSERT(!array->map()->is_observed());
...@@ -496,9 +499,12 @@ BUILTIN(ArrayPush) { ...@@ -496,9 +499,12 @@ BUILTIN(ArrayPush) {
BUILTIN(ArrayPop) { BUILTIN(ArrayPop) {
HandleScope scope(isolate); HandleScope scope(isolate);
Handle<Object> receiver = args.receiver(); Handle<Object> receiver = args.receiver();
Handle<FixedArrayBase> elms_obj = MaybeHandle<FixedArrayBase> maybe_elms_obj =
EnsureJSArrayWithWritableFastElements(isolate, receiver, NULL, 0); EnsureJSArrayWithWritableFastElements(isolate, receiver, NULL, 0);
if (elms_obj.is_null()) return CallJsBuiltin(isolate, "ArrayPop", args); Handle<FixedArrayBase> elms_obj;
if (!maybe_elms_obj.ToHandle(&elms_obj)) {
return CallJsBuiltin(isolate, "ArrayPop", args);
}
Handle<JSArray> array = Handle<JSArray>::cast(receiver); Handle<JSArray> array = Handle<JSArray>::cast(receiver);
ASSERT(!array->map()->is_observed()); ASSERT(!array->map()->is_observed());
...@@ -528,9 +534,10 @@ BUILTIN(ArrayShift) { ...@@ -528,9 +534,10 @@ BUILTIN(ArrayShift) {
HandleScope scope(isolate); HandleScope scope(isolate);
Heap* heap = isolate->heap(); Heap* heap = isolate->heap();
Handle<Object> receiver = args.receiver(); Handle<Object> receiver = args.receiver();
Handle<FixedArrayBase> elms_obj = MaybeHandle<FixedArrayBase> maybe_elms_obj =
EnsureJSArrayWithWritableFastElements(isolate, receiver, NULL, 0); EnsureJSArrayWithWritableFastElements(isolate, receiver, NULL, 0);
if (elms_obj.is_null() || Handle<FixedArrayBase> elms_obj;
if (!maybe_elms_obj.ToHandle(&elms_obj) ||
!IsJSArrayFastElementMovingAllowed(heap, !IsJSArrayFastElementMovingAllowed(heap,
*Handle<JSArray>::cast(receiver))) { *Handle<JSArray>::cast(receiver))) {
return CallJsBuiltin(isolate, "ArrayShift", args); return CallJsBuiltin(isolate, "ArrayShift", args);
...@@ -576,9 +583,10 @@ BUILTIN(ArrayUnshift) { ...@@ -576,9 +583,10 @@ BUILTIN(ArrayUnshift) {
HandleScope scope(isolate); HandleScope scope(isolate);
Heap* heap = isolate->heap(); Heap* heap = isolate->heap();
Handle<Object> receiver = args.receiver(); Handle<Object> receiver = args.receiver();
Handle<FixedArrayBase> elms_obj = MaybeHandle<FixedArrayBase> maybe_elms_obj =
EnsureJSArrayWithWritableFastElements(isolate, receiver, NULL, 0); EnsureJSArrayWithWritableFastElements(isolate, receiver, NULL, 0);
if (elms_obj.is_null() || Handle<FixedArrayBase> elms_obj;
if (!maybe_elms_obj.ToHandle(&elms_obj) ||
!IsJSArrayFastElementMovingAllowed(heap, !IsJSArrayFastElementMovingAllowed(heap,
*Handle<JSArray>::cast(receiver))) { *Handle<JSArray>::cast(receiver))) {
return CallJsBuiltin(isolate, "ArrayUnshift", args); return CallJsBuiltin(isolate, "ArrayUnshift", args);
...@@ -778,9 +786,10 @@ BUILTIN(ArraySplice) { ...@@ -778,9 +786,10 @@ BUILTIN(ArraySplice) {
HandleScope scope(isolate); HandleScope scope(isolate);
Heap* heap = isolate->heap(); Heap* heap = isolate->heap();
Handle<Object> receiver = args.receiver(); Handle<Object> receiver = args.receiver();
Handle<FixedArrayBase> elms_obj = MaybeHandle<FixedArrayBase> maybe_elms_obj =
EnsureJSArrayWithWritableFastElements(isolate, receiver, &args, 3); EnsureJSArrayWithWritableFastElements(isolate, receiver, &args, 3);
if (elms_obj.is_null() || Handle<FixedArrayBase> elms_obj;
if (!maybe_elms_obj.ToHandle(&elms_obj) ||
!IsJSArrayFastElementMovingAllowed(heap, !IsJSArrayFastElementMovingAllowed(heap,
*Handle<JSArray>::cast(receiver))) { *Handle<JSArray>::cast(receiver))) {
return CallJsBuiltin(isolate, "ArraySplice", args); return CallJsBuiltin(isolate, "ArraySplice", args);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment