Chromium Code Reviews| Index: src/runtime.cc |
| diff --git a/src/runtime.cc b/src/runtime.cc |
| index 9211b56653f2bce095fe90262d2ad86252df3c34..2df3e55547b44308065f03b637327d42bd34e466 100644 |
| --- a/src/runtime.cc |
| +++ b/src/runtime.cc |
| @@ -4753,25 +4753,42 @@ MaybeObject* Runtime::SetObjectProperty(Isolate* isolate, |
| } |
| js_object->ValidateElements(); |
| - Handle<Object> result = JSObject::SetElement( |
| - js_object, index, value, attr, strict_mode, set_mode); |
| + if (js_object->HasExternalArrayElements()) { |
| + if (!value->IsSmi() && !value->IsHeapNumber() && !value->IsUndefined()) { |
|
Michael Starzinger
2013/06/17 11:30:29
nit: Better use "!value->IsNumber() && !value->IsU
Jakob Kummerow
2013/06/17 16:50:29
Done.
|
| + bool has_exception; |
| + Handle<Object> number = Execution::ToNumber(value, &has_exception); |
| + if (has_exception) return Failure::Exception(); |
| + value = number; |
| + } |
| + } |
| + MaybeObject* result = js_object->SetElement( |
| + index, *value, attr, strict_mode, true, set_mode); |
| js_object->ValidateElements(); |
| - if (result.is_null()) return Failure::Exception(); |
| + if (result->IsFailure()) return result; |
| return *value; |
| } |
| if (key->IsName()) { |
| - Handle<Object> result; |
| + MaybeObject* result; |
| Handle<Name> name = Handle<Name>::cast(key); |
| if (name->AsArrayIndex(&index)) { |
| - result = JSObject::SetElement( |
| - js_object, index, value, attr, strict_mode, set_mode); |
| + if (js_object->HasExternalArrayElements()) { |
| + if (!value->IsSmi() && |
| + !value->IsHeapNumber() && |
|
Michael Starzinger
2013/06/17 11:30:29
nit: Likewise.
Jakob Kummerow
2013/06/17 16:50:29
Done.
|
| + !value->IsUndefined()) { |
| + bool has_exception; |
| + Handle<Object> number = Execution::ToNumber(value, &has_exception); |
| + if (has_exception) return Failure::Exception(); |
| + value = number; |
| + } |
| + } |
| + result = js_object->SetElement( |
| + index, *value, attr, strict_mode, true, set_mode); |
| } else { |
| if (name->IsString()) Handle<String>::cast(name)->TryFlatten(); |
| - result = JSReceiver::SetProperty( |
| - js_object, name, value, attr, strict_mode); |
| + result = js_object->SetProperty(*name, *value, attr, strict_mode); |
| } |
| - if (result.is_null()) return Failure::Exception(); |
| + if (result->IsFailure()) return result; |
| return *value; |
| } |