| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index b8133ae15e43e3fe08a65114cb60b4c0d8d5300d..ec547e367349fb513a8c1fd290cf42f55d74000c 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -3500,7 +3500,12 @@ static MaybeObject* Runtime_KeyedGetProperty(Arguments args) {
|
| args.at<Object>(1));
|
| }
|
|
|
| -
|
| +// Implements part of 8.12.9 DefineOwnProperty.
|
| +// There are 3 cases that lead here:
|
| +// Step 4b - define a new accessor property.
|
| +// Steps 9c & 12 - replace an existing data property with an accessor property.
|
| +// Step 12 - update an existing accessor property with an accessor or generic
|
| +// descriptor.
|
| static MaybeObject* Runtime_DefineOrRedefineAccessorProperty(Arguments args) {
|
| ASSERT(args.length() == 5);
|
| HandleScope scope;
|
| @@ -3532,6 +3537,12 @@ static MaybeObject* Runtime_DefineOrRedefineAccessorProperty(Arguments args) {
|
| return obj->DefineAccessor(name, flag_setter->value() == 0, fun, attr);
|
| }
|
|
|
| +// Implements part of 8.12.9 DefineOwnProperty.
|
| +// There are 3 cases that lead here:
|
| +// Step 4a - define a new data property.
|
| +// Steps 9b & 12 - replace an existing accessor property with a data property.
|
| +// Step 12 - update an existing data property with a data or generic
|
| +// descriptor.
|
| static MaybeObject* Runtime_DefineOrRedefineDataProperty(Arguments args) {
|
| ASSERT(args.length() == 4);
|
| HandleScope scope;
|
| @@ -3555,7 +3566,9 @@ static MaybeObject* Runtime_DefineOrRedefineDataProperty(Arguments args) {
|
| if (((unchecked & (DONT_DELETE | DONT_ENUM | READ_ONLY)) != 0) &&
|
| is_element) {
|
| // Normalize the elements to enable attributes on the property.
|
| - NormalizeElements(js_object);
|
| + if (!js_object->IsJSGlobalProxy()) {
|
| + NormalizeElements(js_object);
|
| + }
|
| Handle<NumberDictionary> dictionary(js_object->element_dictionary());
|
| // Make sure that we never go back to fast case.
|
| dictionary->set_requires_slow_elements();
|
| @@ -3575,7 +3588,9 @@ static MaybeObject* Runtime_DefineOrRedefineDataProperty(Arguments args) {
|
| if (result.IsProperty() &&
|
| (attr != result.GetAttributes() || result.type() == CALLBACKS)) {
|
| // New attributes - normalize to avoid writing to instance descriptor
|
| - NormalizeProperties(js_object, CLEAR_INOBJECT_PROPERTIES, 0);
|
| + if (!js_object->IsJSGlobalProxy()) {
|
| + NormalizeProperties(js_object, CLEAR_INOBJECT_PROPERTIES, 0);
|
| + }
|
| // Use IgnoreAttributes version since a readonly property may be
|
| // overridden and SetProperty does not allow this.
|
| return js_object->SetLocalPropertyIgnoreAttributes(*name,
|
|
|