| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index 9211b56653f2bce095fe90262d2ad86252df3c34..6112035b05dc78d5cb9fc48960dc9e125032f23b 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -4753,25 +4753,40 @@ 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->IsNumber() && !value->IsUndefined()) {
|
| + 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->IsNumber() && !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;
|
| }
|
|
|
|
|