Index: src/runtime/runtime-object.cc |
diff --git a/src/runtime/runtime-object.cc b/src/runtime/runtime-object.cc |
index e0e3764837a4cfdfb1d84b49db528127604e5c19..956fee9e838f46214ed47b017e7a0a226efedf99 100644 |
--- a/src/runtime/runtime-object.cc |
+++ b/src/runtime/runtime-object.cc |
@@ -132,8 +132,8 @@ MaybeHandle<Object> Runtime::SetObjectProperty(Isolate* isolate, |
} |
} |
- MaybeHandle<Object> result = JSObject::SetElement( |
- js_object, index, value, NONE, language_mode, true, SET_PROPERTY); |
+ MaybeHandle<Object> result = |
+ JSObject::SetElement(js_object, index, value, language_mode); |
JSObject::ValidateElements(js_object); |
return result.is_null() ? result : value; |
@@ -151,8 +151,7 @@ MaybeHandle<Object> Runtime::SetObjectProperty(Isolate* isolate, |
isolate, value, Execution::ToNumber(isolate, value), Object); |
} |
} |
- return JSObject::SetElement(js_object, index, value, NONE, language_mode, |
- true, SET_PROPERTY); |
+ return JSObject::SetElement(js_object, index, value, language_mode); |
} else { |
if (name->IsString()) name = String::Flatten(Handle<String>::cast(name)); |
return Object::SetProperty(object, name, value, language_mode); |
@@ -169,8 +168,7 @@ MaybeHandle<Object> Runtime::SetObjectProperty(Isolate* isolate, |
// TODO(verwaest): Support non-JSObject receivers. |
if (!object->IsJSObject()) return value; |
Handle<JSObject> js_object = Handle<JSObject>::cast(object); |
- return JSObject::SetElement(js_object, index, value, NONE, language_mode, |
- true, SET_PROPERTY); |
+ return JSObject::SetElement(js_object, index, value, language_mode); |
} |
return Object::SetProperty(object, name, value, language_mode); |
} |
@@ -184,43 +182,26 @@ MaybeHandle<Object> Runtime::DefineObjectProperty(Handle<JSObject> js_object, |
// Check if the given key is an array index. |
uint32_t index = 0; |
if (key->ToArrayIndex(&index)) { |
- // In Firefox/SpiderMonkey, Safari and Opera you can access the characters |
- // of a string using [] notation. We need to support this too in |
- // JavaScript. |
- // In the case of a String object we just need to redirect the assignment to |
- // the underlying string if the index is in range. Since the underlying |
- // string does nothing with the assignment then we can ignore such |
- // assignments. |
- if (js_object->IsStringObjectWithCharacterAt(index)) { |
- return value; |
- } |
- |
- return JSObject::SetElement(js_object, index, value, attrs, SLOPPY, false, |
- DEFINE_PROPERTY); |
+ return JSObject::SetOwnElementIgnoreAttributes(js_object, index, value, |
+ attrs); |
} |
+ Handle<Name> name; |
if (key->IsName()) { |
- Handle<Name> name = Handle<Name>::cast(key); |
- if (name->AsArrayIndex(&index)) { |
- return JSObject::SetElement(js_object, index, value, attrs, SLOPPY, false, |
- DEFINE_PROPERTY); |
- } else { |
- if (name->IsString()) name = String::Flatten(Handle<String>::cast(name)); |
- return JSObject::SetOwnPropertyIgnoreAttributes(js_object, name, value, |
- attrs); |
- } |
+ name = Handle<Name>::cast(key); |
+ } else { |
+ // Call-back into JavaScript to convert the key to a string. |
+ Handle<Object> converted; |
+ ASSIGN_RETURN_ON_EXCEPTION(isolate, converted, |
+ Execution::ToString(isolate, key), Object); |
+ name = Handle<String>::cast(converted); |
} |
- // Call-back into JavaScript to convert the key to a string. |
- Handle<Object> converted; |
- ASSIGN_RETURN_ON_EXCEPTION(isolate, converted, |
- Execution::ToString(isolate, key), Object); |
- Handle<String> name = Handle<String>::cast(converted); |
- |
if (name->AsArrayIndex(&index)) { |
- return JSObject::SetElement(js_object, index, value, attrs, SLOPPY, false, |
- DEFINE_PROPERTY); |
+ return JSObject::SetOwnElementIgnoreAttributes(js_object, index, value, |
+ attrs); |
} else { |
+ if (name->IsString()) name = String::Flatten(Handle<String>::cast(name)); |
return JSObject::SetOwnPropertyIgnoreAttributes(js_object, name, value, |
attrs); |
} |
@@ -624,14 +605,14 @@ RUNTIME_FUNCTION(Runtime_AddNamedProperty) { |
RUNTIME_ASSERT(args.length() == 4); |
CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); |
- CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); |
+ CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); |
CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); |
CONVERT_PROPERTY_ATTRIBUTES_CHECKED(attrs, 3); |
#ifdef DEBUG |
uint32_t index = 0; |
- DCHECK(!key->ToArrayIndex(&index)); |
- LookupIterator it(object, key, LookupIterator::OWN_SKIP_INTERCEPTOR); |
+ DCHECK(!name->ToArrayIndex(&index)); |
+ LookupIterator it(object, name, LookupIterator::OWN_SKIP_INTERCEPTOR); |
Maybe<PropertyAttributes> maybe = JSReceiver::GetPropertyAttributes(&it); |
if (!maybe.IsJust()) return isolate->heap()->exception(); |
RUNTIME_ASSERT(!it.IsFound()); |
@@ -640,25 +621,7 @@ RUNTIME_FUNCTION(Runtime_AddNamedProperty) { |
Handle<Object> result; |
ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
isolate, result, |
- JSObject::SetOwnPropertyIgnoreAttributes(object, key, value, attrs)); |
- return *result; |
-} |
- |
- |
-RUNTIME_FUNCTION(Runtime_SetProperty) { |
- HandleScope scope(isolate); |
- RUNTIME_ASSERT(args.length() == 4); |
- |
- CONVERT_ARG_HANDLE_CHECKED(Object, object, 0); |
- CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); |
- CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); |
- CONVERT_LANGUAGE_MODE_ARG_CHECKED(language_mode_arg, 3); |
- LanguageMode language_mode = language_mode_arg; |
- |
- Handle<Object> result; |
- ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
- isolate, result, |
- Runtime::SetObjectProperty(isolate, object, key, value, language_mode)); |
+ JSObject::SetOwnPropertyIgnoreAttributes(object, name, value, attrs)); |
return *result; |
} |
@@ -667,20 +630,32 @@ RUNTIME_FUNCTION(Runtime_SetProperty) { |
// This is used to create an indexed data property into an array. |
RUNTIME_FUNCTION(Runtime_AddElement) { |
HandleScope scope(isolate); |
- RUNTIME_ASSERT(args.length() == 4); |
+ RUNTIME_ASSERT(args.length() == 3); |
CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); |
CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); |
CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); |
- CONVERT_PROPERTY_ATTRIBUTES_CHECKED(attrs, 3); |
uint32_t index = 0; |
- key->ToArrayIndex(&index); |
+ CHECK(key->ToArrayIndex(&index)); |
+ |
+#ifdef DEBUG |
+ LookupIterator it(isolate, object, index, |
+ LookupIterator::OWN_SKIP_INTERCEPTOR); |
+ Maybe<PropertyAttributes> maybe = JSReceiver::GetPropertyAttributes(&it); |
+ if (!maybe.IsJust()) return isolate->heap()->exception(); |
+ RUNTIME_ASSERT(!it.IsFound()); |
+ |
+ if (object->IsJSArray()) { |
+ Handle<JSArray> array = Handle<JSArray>::cast(object); |
+ RUNTIME_ASSERT(!JSArray::WouldChangeReadOnlyLength(array, index)); |
+ } |
+#endif |
Handle<Object> result; |
ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
- isolate, result, JSObject::SetElement(object, index, value, attrs, SLOPPY, |
- false, DEFINE_PROPERTY)); |
+ isolate, result, |
+ JSObject::SetOwnElementIgnoreAttributes(object, index, value, NONE)); |
return *result; |
} |
@@ -692,16 +667,34 @@ RUNTIME_FUNCTION(Runtime_AppendElement) { |
CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0); |
CONVERT_ARG_HANDLE_CHECKED(Object, value, 1); |
- int index = Smi::cast(array->length())->value(); |
+ uint32_t index; |
+ CHECK(array->length()->ToArrayIndex(&index)); |
Handle<Object> result; |
ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
- isolate, result, JSObject::SetElement(array, index, value, NONE, SLOPPY, |
- false, DEFINE_PROPERTY)); |
+ isolate, result, JSObject::AddDataElement(array, index, value, NONE)); |
return *array; |
} |
+RUNTIME_FUNCTION(Runtime_SetProperty) { |
+ HandleScope scope(isolate); |
+ RUNTIME_ASSERT(args.length() == 4); |
+ |
+ CONVERT_ARG_HANDLE_CHECKED(Object, object, 0); |
+ CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); |
+ CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); |
+ CONVERT_LANGUAGE_MODE_ARG_CHECKED(language_mode_arg, 3); |
+ LanguageMode language_mode = language_mode_arg; |
+ |
+ Handle<Object> result; |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, result, |
+ Runtime::SetObjectProperty(isolate, object, key, value, language_mode)); |
+ return *result; |
+} |
+ |
+ |
RUNTIME_FUNCTION(Runtime_DeleteProperty) { |
HandleScope scope(isolate); |
DCHECK(args.length() == 3); |
@@ -1375,19 +1368,6 @@ RUNTIME_FUNCTION(Runtime_DefineDataPropertyUnchecked) { |
it.Next(); |
} |
- // Take special care when attributes are different and there is already |
- // a property. |
- if (it.state() == LookupIterator::ACCESSOR) { |
- // Use IgnoreAttributes version since a readonly property may be |
- // overridden and SetProperty does not allow this. |
- Handle<Object> result; |
- ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
- isolate, result, |
- JSObject::SetOwnPropertyIgnoreAttributes( |
- js_object, name, obj_value, attrs, JSObject::DONT_FORCE_FIELD)); |
- return *result; |
- } |
- |
Handle<Object> result; |
ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
isolate, result, |