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); |