Index: src/runtime.cc |
diff --git a/src/runtime.cc b/src/runtime.cc |
index e176951a7da6ab0d326120340ea1472361938696..9410a38b32b373755d14614a5076afaf244b2f1a 100644 |
--- a/src/runtime.cc |
+++ b/src/runtime.cc |
@@ -331,18 +331,23 @@ MUST_USE_RESULT static MaybeHandle<Object> CreateObjectLiteralBoilerplate( |
} |
-MaybeObject* TransitionElements(Handle<Object> object, |
- ElementsKind to_kind, |
- Isolate* isolate) { |
+MUST_USE_RESULT static MaybeHandle<Object> TransitionElements( |
+ Handle<Object> object, |
+ ElementsKind to_kind, |
+ Isolate* isolate) { |
HandleScope scope(isolate); |
- if (!object->IsJSObject()) return isolate->ThrowIllegalOperation(); |
+ if (!object->IsJSObject()) { |
+ isolate->ThrowIllegalOperation(); |
+ return MaybeHandle<Object>(); |
+ } |
ElementsKind from_kind = |
Handle<JSObject>::cast(object)->map()->elements_kind(); |
if (Map::IsValidElementsTransition(from_kind, to_kind)) { |
JSObject::TransitionElementsKind(Handle<JSObject>::cast(object), to_kind); |
- return *object; |
+ return object; |
} |
- return isolate->ThrowIllegalOperation(); |
+ isolate->ThrowIllegalOperation(); |
+ return MaybeHandle<Object>(); |
} |
@@ -368,14 +373,14 @@ MaybeHandle<Object> Runtime::CreateArrayLiteralBoilerplate( |
Handle<FixedArrayBase> constant_elements_values( |
FixedArrayBase::cast(elements->get(1))); |
- ASSERT(IsFastElementsKind(constant_elements_kind)); |
- Context* native_context = isolate->context()->native_context(); |
- Object* maybe_maps_array = native_context->js_array_maps(); |
- ASSERT(!maybe_maps_array->IsUndefined()); |
- Object* maybe_map = FixedArray::cast(maybe_maps_array)->get( |
- constant_elements_kind); |
- ASSERT(maybe_map->IsMap()); |
- object->set_map(Map::cast(maybe_map)); |
+ { DisallowHeapAllocation no_gc; |
+ ASSERT(IsFastElementsKind(constant_elements_kind)); |
+ Context* native_context = isolate->context()->native_context(); |
+ Object* maps_array = native_context->js_array_maps(); |
+ ASSERT(!maps_array->IsUndefined()); |
+ Object* map = FixedArray::cast(maps_array)->get(constant_elements_kind); |
+ object->set_map(Map::cast(map)); |
+ } |
Handle<FixedArrayBase> copied_elements_values; |
if (IsFastDoubleElementsKind(constant_elements_kind)) { |
@@ -403,8 +408,7 @@ MaybeHandle<Object> Runtime::CreateArrayLiteralBoilerplate( |
isolate->factory()->CopyFixedArray(fixed_array_values); |
copied_elements_values = fixed_array_values_copy; |
for (int i = 0; i < fixed_array_values->length(); i++) { |
- Object* current = fixed_array_values->get(i); |
- if (current->IsFixedArray()) { |
+ if (fixed_array_values->get(i)->IsFixedArray()) { |
// The value contains the constant_properties of a |
// simple object or array literal. |
Handle<FixedArray> fa(FixedArray::cast(fixed_array_values->get(i))); |
@@ -428,10 +432,9 @@ MaybeHandle<Object> Runtime::CreateArrayLiteralBoilerplate( |
ElementsKind elements_kind = object->GetElementsKind(); |
if (!IsFastObjectElementsKind(elements_kind)) { |
if (IsFastHoleyElementsKind(elements_kind)) { |
- CHECK(!TransitionElements(object, FAST_HOLEY_ELEMENTS, |
- isolate)->IsFailure()); |
+ TransitionElements(object, FAST_HOLEY_ELEMENTS, isolate).Check(); |
} else { |
- CHECK(!TransitionElements(object, FAST_ELEMENTS, isolate)->IsFailure()); |
+ TransitionElements(object, FAST_ELEMENTS, isolate).Check(); |
} |
} |
} |
@@ -5076,17 +5079,14 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_KeyedGetProperty) { |
Handle<JSObject> js_object(args.at<JSObject>(0)); |
ElementsKind elements_kind = js_object->GetElementsKind(); |
if (IsFastDoubleElementsKind(elements_kind)) { |
- FixedArrayBase* elements = js_object->elements(); |
- if (args.at<Smi>(1)->value() >= elements->length()) { |
+ if (args.at<Smi>(1)->value() >= js_object->elements()->length()) { |
if (IsFastHoleyElementsKind(elements_kind)) { |
elements_kind = FAST_HOLEY_ELEMENTS; |
} else { |
elements_kind = FAST_ELEMENTS; |
} |
- MaybeObject* maybe_object = TransitionElements(js_object, |
- elements_kind, |
- isolate); |
- if (maybe_object->IsFailure()) return maybe_object; |
+ RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, TransitionElements(js_object, elements_kind, isolate)); |
} |
} else { |
ASSERT(IsFastSmiOrObjectElementsKind(elements_kind) || |