Index: src/runtime.cc |
diff --git a/src/runtime.cc b/src/runtime.cc |
index ab2c2b5262a54648b31ca3b120d8f67ca540697f..8d58db74a017a357d005a22818716976c2e9e5c6 100644 |
--- a/src/runtime.cc |
+++ b/src/runtime.cc |
@@ -638,8 +638,8 @@ static Object* Runtime_GetOwnProperty(Arguments args) { |
Handle<FixedArray> elms = Factory::NewFixedArray(DESCRIPTOR_SIZE); |
Handle<JSArray> desc = Factory::NewJSArrayWithElements(elms); |
LookupResult result; |
- CONVERT_CHECKED(JSObject, obj, args[0]); |
- CONVERT_CHECKED(String, name, args[1]); |
+ CONVERT_ARG_CHECKED(JSObject, obj, 0); |
+ CONVERT_ARG_CHECKED(String, name, 1); |
// This could be an element. |
uint32_t index; |
@@ -653,10 +653,12 @@ static Object* Runtime_GetOwnProperty(Arguments args) { |
// 15.5.5.2. Note that this might be a string object with elements |
// other than the actual string value. This is covered by the |
// subsequent cases. |
- JSValue* js_value = JSValue::cast(obj); |
- String* str = String::cast(js_value->value()); |
+ Handle<JSValue> js_value = Handle<JSValue>::cast(obj); |
+ Handle<String> str(String::cast(js_value->value())); |
+ Handle<String> substr = SubString(str, index, index+1, NOT_TENURED); |
+ |
elms->set(IS_ACCESSOR_INDEX, Heap::false_value()); |
- elms->set(VALUE_INDEX, str->SubString(index, index+1)); |
+ elms->set(VALUE_INDEX, *substr); |
elms->set(WRITABLE_INDEX, Heap::false_value()); |
elms->set(ENUMERABLE_INDEX, Heap::false_value()); |
elms->set(CONFIGURABLE_INDEX, Heap::false_value()); |
@@ -664,13 +666,15 @@ static Object* Runtime_GetOwnProperty(Arguments args) { |
} |
case JSObject::INTERCEPTED_ELEMENT: |
- case JSObject::FAST_ELEMENT: |
+ case JSObject::FAST_ELEMENT: { |
elms->set(IS_ACCESSOR_INDEX, Heap::false_value()); |
- elms->set(VALUE_INDEX, obj->GetElement(index)); |
+ Handle<Object> element = GetElement(Handle<Object>(obj), index); |
+ elms->set(VALUE_INDEX, *element); |
elms->set(WRITABLE_INDEX, Heap::true_value()); |
elms->set(ENUMERABLE_INDEX, Heap::true_value()); |
elms->set(CONFIGURABLE_INDEX, Heap::true_value()); |
return *desc; |
+ } |
case JSObject::DICTIONARY_ELEMENT: { |
NumberDictionary* dictionary = obj->element_dictionary(); |
@@ -705,7 +709,7 @@ static Object* Runtime_GetOwnProperty(Arguments args) { |
} |
// Use recursive implementation to also traverse hidden prototypes |
- GetOwnPropertyImplementation(obj, name, &result); |
+ GetOwnPropertyImplementation(*obj, *name, &result); |
if (!result.IsProperty()) { |
return Heap::undefined_value(); |
@@ -716,7 +720,8 @@ static Object* Runtime_GetOwnProperty(Arguments args) { |
// Property that is internally implemented as a callback or |
// an API defined callback. |
Object* value = obj->GetPropertyWithCallback( |
- obj, structure, name, result.holder()); |
+ *obj, structure, *name, result.holder()); |
+ if (value->IsFailure()) return value; |
elms->set(IS_ACCESSOR_INDEX, Heap::false_value()); |
elms->set(VALUE_INDEX, value); |
elms->set(WRITABLE_INDEX, Heap::ToBoolean(!result.IsReadOnly())); |
@@ -7537,14 +7542,18 @@ static Object* Runtime_ArrayConcat(Arguments args) { |
// The backing storage array must have non-existing elements to |
// preserve holes across concat operations. |
storage = Factory::NewFixedArrayWithHoles(result_length); |
- result->set_map(*Factory::GetFastElementsMap(Handle<Map>(result->map()))); |
+ Handle<Map> fast_map = |
+ Factory::GetFastElementsMap(Handle<Map>(result->map())); |
+ result->set_map(*fast_map); |
} else { |
// TODO(126): move 25% pre-allocation logic into Dictionary::Allocate |
uint32_t at_least_space_for = estimate_nof_elements + |
(estimate_nof_elements >> 2); |
storage = Handle<FixedArray>::cast( |
Factory::NewNumberDictionary(at_least_space_for)); |
- result->set_map(*Factory::GetSlowElementsMap(Handle<Map>(result->map()))); |
+ Handle<Map> slow_map = |
+ Factory::GetSlowElementsMap(Handle<Map>(result->map())); |
+ result->set_map(*slow_map); |
} |
Handle<Object> len = Factory::NewNumber(static_cast<double>(result_length)); |
@@ -9079,10 +9088,10 @@ static Handle<Context> CopyWithContextChain(Handle<Context> context_chain, |
// Recursively copy the with contexts. |
Handle<Context> previous(context_chain->previous()); |
Handle<JSObject> extension(JSObject::cast(context_chain->extension())); |
- return Factory::NewWithContext( |
- CopyWithContextChain(function_context, previous), |
- extension, |
- context_chain->IsCatchContext()); |
+ Handle<Context> context = CopyWithContextChain(function_context, previous); |
+ return Factory::NewWithContext(context, |
+ extension, |
+ context_chain->IsCatchContext()); |
} |