Index: src/builtins.cc |
diff --git a/src/builtins.cc b/src/builtins.cc |
index 4e5fbd3f18a596bd6b2b6901458c104f162fd834..27efaeaa1c0e761f10d7cf7b503426cbdbaa0894 100644 |
--- a/src/builtins.cc |
+++ b/src/builtins.cc |
@@ -507,6 +507,17 @@ BUILTIN(ArrayPush) { |
} |
+static Handle<Object> ElementsAccessorSetLengthWrapper( |
+ Isolate* isolate, |
+ ElementsAccessor* accessor, |
+ Handle<JSArray> array, |
+ int new_length) { |
+ CALL_HEAP_FUNCTION(isolate, |
+ accessor->SetLength(*array, Smi::FromInt(new_length)), |
+ Object); |
+} |
+ |
+ |
BUILTIN(ArrayPop) { |
Heap* heap = isolate->heap(); |
Object* receiver = *args.receiver(); |
@@ -524,17 +535,26 @@ BUILTIN(ArrayPop) { |
ElementsAccessor* accessor = array->GetElementsAccessor(); |
int new_length = len - 1; |
- MaybeObject* maybe_result; |
if (accessor->HasElement(array, array, new_length, elms_obj)) { |
- maybe_result = accessor->Get(array, array, new_length, elms_obj); |
+ MaybeObject* maybe_result = |
+ accessor->Get(array, array, new_length, elms_obj); |
+ if (maybe_result->IsFailure()) return maybe_result; |
+ MaybeObject* maybe_failure = |
+ accessor->SetLength(array, Smi::FromInt(new_length)); |
+ if (maybe_failure->IsFailure()) return maybe_failure; |
+ return maybe_result; |
} else { |
- maybe_result = array->GetPrototype()->GetElement(isolate, len - 1); |
+ // TODO(yangguo): handlify all once ElementsAccessors are handlified. |
+ HandleScope scope(isolate); |
+ Handle<Object> proto(array->GetPrototype(), isolate); |
+ Handle<Object> element = Object::GetElement(isolate, proto, len - 1); |
+ RETURN_IF_EMPTY_HANDLE(isolate, element); |
+ Handle<JSArray> array_handle(array, isolate); |
+ RETURN_IF_EMPTY_HANDLE(isolate, |
+ ElementsAccessorSetLengthWrapper( |
+ isolate, accessor, array_handle, new_length)); |
+ return *element; |
} |
- if (maybe_result->IsFailure()) return maybe_result; |
- MaybeObject* maybe_failure = |
- accessor->SetLength(array, Smi::FromInt(new_length)); |
- if (maybe_failure->IsFailure()) return maybe_failure; |
- return maybe_result; |
} |