Index: src/runtime.cc |
diff --git a/src/runtime.cc b/src/runtime.cc |
index 959768195971d35f21b5f8519e934a1c8e849274..6d187ad4975978b34dd75bf56f26682ec8a0ed50 100644 |
--- a/src/runtime.cc |
+++ b/src/runtime.cc |
@@ -4355,53 +4355,6 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DefineOrRedefineDataProperty) { |
RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); |
PropertyAttributes attr = static_cast<PropertyAttributes>(unchecked); |
- // Check if this is an element. |
- uint32_t index; |
- bool is_element = name->AsArrayIndex(&index); |
- |
- // Special case for elements if any of the flags might be involved. |
- // If elements are in fast case we always implicitly assume that: |
- // DONT_DELETE: false, DONT_ENUM: false, READ_ONLY: false. |
- if (is_element && (attr != NONE || |
- js_object->HasLocalElement(index) == JSObject::DICTIONARY_ELEMENT)) { |
- // Normalize the elements to enable attributes on the property. |
- if (js_object->IsJSGlobalProxy()) { |
- // We do not need to do access checks here since these has already |
- // been performed by the call to GetOwnProperty. |
- Handle<Object> proto(js_object->GetPrototype()); |
- // If proxy is detached, ignore the assignment. Alternatively, |
- // we could throw an exception. |
- if (proto->IsNull()) return *obj_value; |
- js_object = Handle<JSObject>::cast(proto); |
- } |
- |
- // Don't allow element properties to be redefined on objects with external |
- // array elements. |
- if (js_object->HasExternalArrayElements()) { |
- Handle<Object> args[2] = { js_object, name }; |
- Handle<Object> error = |
- isolate->factory()->NewTypeError("redef_external_array_element", |
- HandleVector(args, 2)); |
- return isolate->Throw(*error); |
- } |
- |
- Handle<SeededNumberDictionary> dictionary = |
- JSObject::NormalizeElements(js_object); |
- // Make sure that we never go back to fast case. |
- dictionary->set_requires_slow_elements(); |
- PropertyDetails details = PropertyDetails(attr, NORMAL); |
- Handle<SeededNumberDictionary> extended_dictionary = |
- SeededNumberDictionary::Set(dictionary, index, obj_value, details); |
- if (*extended_dictionary != *dictionary) { |
- if (js_object->GetElementsKind() == NON_STRICT_ARGUMENTS_ELEMENTS) { |
- FixedArray::cast(js_object->elements())->set(1, *extended_dictionary); |
- } else { |
- js_object->set_elements(*extended_dictionary); |
- } |
- } |
- return *obj_value; |
- } |
- |
LookupResult result(isolate); |
js_object->LocalLookupRealNamedProperty(*name, &result); |
@@ -4457,35 +4410,13 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DefineOrRedefineDataProperty) { |
} |
-// Special case for elements if any of the flags are true. |
-// If elements are in fast case we always implicitly assume that: |
-// DONT_DELETE: false, DONT_ENUM: false, READ_ONLY: false. |
-static MaybeObject* NormalizeObjectSetElement(Isolate* isolate, |
- Handle<JSObject> js_object, |
- uint32_t index, |
- Handle<Object> value, |
- PropertyAttributes attr) { |
- // Normalize the elements to enable attributes on the property. |
- Handle<SeededNumberDictionary> dictionary = |
- JSObject::NormalizeElements(js_object); |
- // Make sure that we never go back to fast case. |
- dictionary->set_requires_slow_elements(); |
- PropertyDetails details = PropertyDetails(attr, NORMAL); |
- Handle<SeededNumberDictionary> extended_dictionary = |
- SeededNumberDictionary::Set(dictionary, index, value, details); |
- if (*extended_dictionary != *dictionary) { |
- js_object->set_elements(*extended_dictionary); |
- } |
- return *value; |
-} |
- |
- |
MaybeObject* Runtime::SetObjectProperty(Isolate* isolate, |
Handle<Object> object, |
Handle<Object> key, |
Handle<Object> value, |
PropertyAttributes attr, |
StrictModeFlag strict_mode) { |
+ SetPropertyMode set_mode = attr == NONE ? SET_PROPERTY : DEFINE_PROPERTY; |
HandleScope scope(isolate); |
if (object->IsUndefined() || object->IsNull()) { |
@@ -4523,12 +4454,8 @@ MaybeObject* Runtime::SetObjectProperty(Isolate* isolate, |
return *value; |
} |
- if (((attr & (DONT_DELETE | DONT_ENUM | READ_ONLY)) != 0)) { |
- return NormalizeObjectSetElement(isolate, js_object, index, value, attr); |
- } |
- |
- Handle<Object> result = |
- JSObject::SetElement(js_object, index, value, strict_mode); |
+ Handle<Object> result = JSObject::SetElement( |
+ js_object, index, value, attr, strict_mode, set_mode); |
if (result.is_null()) return Failure::Exception(); |
return *value; |
} |
@@ -4536,15 +4463,8 @@ MaybeObject* Runtime::SetObjectProperty(Isolate* isolate, |
if (key->IsString()) { |
Handle<Object> result; |
if (Handle<String>::cast(key)->AsArrayIndex(&index)) { |
- if (((attr & (DONT_DELETE | DONT_ENUM | READ_ONLY)) != 0)) { |
- return NormalizeObjectSetElement(isolate, |
- js_object, |
- index, |
- value, |
- attr); |
- } |
- result = |
- JSObject::SetElement(js_object, index, value, strict_mode); |
+ result = JSObject::SetElement( |
+ js_object, index, value, attr, strict_mode, set_mode); |
} else { |
Handle<String> key_string = Handle<String>::cast(key); |
key_string->TryFlatten(); |
@@ -4562,7 +4482,8 @@ MaybeObject* Runtime::SetObjectProperty(Isolate* isolate, |
Handle<String> name = Handle<String>::cast(converted); |
if (name->AsArrayIndex(&index)) { |
- return js_object->SetElement(index, *value, strict_mode, true); |
+ return js_object->SetElement( |
+ index, *value, attr, strict_mode, true, set_mode); |
} else { |
return js_object->SetProperty(*name, *value, attr, strict_mode); |
} |
@@ -4590,12 +4511,14 @@ MaybeObject* Runtime::ForceSetObjectProperty(Isolate* isolate, |
return *value; |
} |
- return js_object->SetElement(index, *value, kNonStrictMode, true); |
+ return js_object->SetElement( |
+ index, *value, attr, kNonStrictMode, false, DEFINE_PROPERTY); |
} |
if (key->IsString()) { |
if (Handle<String>::cast(key)->AsArrayIndex(&index)) { |
- return js_object->SetElement(index, *value, kNonStrictMode, true); |
+ return js_object->SetElement( |
+ index, *value, attr, kNonStrictMode, false, DEFINE_PROPERTY); |
} else { |
Handle<String> key_string = Handle<String>::cast(key); |
key_string->TryFlatten(); |
@@ -4612,7 +4535,8 @@ MaybeObject* Runtime::ForceSetObjectProperty(Isolate* isolate, |
Handle<String> name = Handle<String>::cast(converted); |
if (name->AsArrayIndex(&index)) { |
- return js_object->SetElement(index, *value, kNonStrictMode, true); |
+ return js_object->SetElement( |
+ index, *value, attr, kNonStrictMode, false, DEFINE_PROPERTY); |
} else { |
return js_object->SetLocalPropertyIgnoreAttributes(*name, *value, attr); |
} |
@@ -10316,9 +10240,9 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_SwapElements) { |
RETURN_IF_EMPTY_HANDLE(isolate, tmp2); |
RETURN_IF_EMPTY_HANDLE( |
- isolate, JSObject::SetElement(jsobject, index1, tmp2, kStrictMode)); |
+ isolate, JSObject::SetElement(jsobject, index1, tmp2, NONE, kStrictMode)); |
RETURN_IF_EMPTY_HANDLE( |
- isolate, JSObject::SetElement(jsobject, index2, tmp1, kStrictMode)); |
+ isolate, JSObject::SetElement(jsobject, index2, tmp1, NONE, kStrictMode)); |
return isolate->heap()->undefined_value(); |
} |