Chromium Code Reviews| Index: src/objects.cc |
| diff --git a/src/objects.cc b/src/objects.cc |
| index 570f6fbae4f7c0269db737c7e03ac6a33c0865df..244b732ed85a46aed029026d6a47b1268280450b 100644 |
| --- a/src/objects.cc |
| +++ b/src/objects.cc |
| @@ -10307,6 +10307,7 @@ MaybeObject* JSObject::SetElement(uint32_t index, |
| // From here on, everything has to be handlified. |
| Handle<String> name; |
| Handle<Object> old_value(isolate->heap()->the_hole_value()); |
| + Handle<Object> old_array_length; |
| PropertyAttributes old_attributes = ABSENT; |
| bool preexists = false; |
| if (FLAG_harmony_observation && map()->is_observed()) { |
| @@ -10317,6 +10318,9 @@ MaybeObject* JSObject::SetElement(uint32_t index, |
| // TODO(observe): only read & set old_value if we have a data property |
| old_value = Object::GetElement(self, index); |
| } |
| + // Store the old array length in case adding an element will grow the array. |
| + if (!preexists && self->IsJSArray()) |
|
rossberg
2012/11/08 16:50:20
Maybe make that an "else if (self->IsJSArray())"
adamk
2012/11/08 17:08:18
Done.
|
| + old_array_length = handle(Handle<JSArray>::cast(self)->length()); |
| } |
| // Check for lookup interceptor |
| @@ -10332,6 +10336,12 @@ MaybeObject* JSObject::SetElement(uint32_t index, |
| if (FLAG_harmony_observation && map()->is_observed()) { |
| PropertyAttributes new_attributes = self->GetLocalPropertyAttribute(*name); |
| if (!preexists) { |
| + if (self->IsJSArray() && |
| + !old_array_length->SameValue(Handle<JSArray>::cast(self)->length())) { |
| + EnqueueChangeRecord(self, "updated", |
| + isolate->factory()->length_symbol(), |
| + old_array_length); |
| + } |
| EnqueueChangeRecord(self, "new", name, old_value); |
| } else if (new_attributes != old_attributes || old_value->IsTheHole()) { |
| EnqueueChangeRecord(self, "reconfigured", name, old_value); |