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; |
} |