Index: src/runtime.cc |
diff --git a/src/runtime.cc b/src/runtime.cc |
index 239ba082b25c2ae7bd30783dfd36fbdb371b35ff..0c4237f8ca0f9bb137c949f0a5078769c20bbf5a 100644 |
--- a/src/runtime.cc |
+++ b/src/runtime.cc |
@@ -3602,7 +3602,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; |
@@ -3634,6 +3639,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; |
@@ -3657,7 +3668,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(); |
@@ -3677,7 +3690,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, |
@@ -4273,7 +4288,7 @@ static MaybeObject* Runtime_ToSlowProperties(Arguments args) { |
ASSERT(args.length() == 1); |
Handle<Object> object = args.at<Object>(0); |
- if (object->IsJSObject()) { |
+ if (object->IsJSObject() && !object->IsJSGlobalProxy()) { |
Handle<JSObject> js_object = Handle<JSObject>::cast(object); |
NormalizeProperties(js_object, CLEAR_INOBJECT_PROPERTIES, 0); |
} |