| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 570f6fbae4f7c0269db737c7e03ac6a33c0865df..fd6f4041d8e4f36c0d392addbc6e96c0b6f30f89 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()) {
|
| @@ -10316,6 +10317,9 @@ MaybeObject* JSObject::SetElement(uint32_t index,
|
| old_attributes = self->GetLocalPropertyAttribute(*name);
|
| // TODO(observe): only read & set old_value if we have a data property
|
| old_value = Object::GetElement(self, index);
|
| + } else if (self->IsJSArray()) {
|
| + // Store old array length in case adding an element grows the array.
|
| + old_array_length = handle(Handle<JSArray>::cast(self)->length());
|
| }
|
| }
|
|
|
| @@ -10333,11 +10337,17 @@ MaybeObject* JSObject::SetElement(uint32_t index,
|
| PropertyAttributes new_attributes = self->GetLocalPropertyAttribute(*name);
|
| if (!preexists) {
|
| EnqueueChangeRecord(self, "new", name, old_value);
|
| + if (self->IsJSArray() &&
|
| + !old_array_length->SameValue(Handle<JSArray>::cast(self)->length())) {
|
| + EnqueueChangeRecord(self, "updated",
|
| + isolate->factory()->length_symbol(),
|
| + old_array_length);
|
| + }
|
| } else if (new_attributes != old_attributes || old_value->IsTheHole()) {
|
| EnqueueChangeRecord(self, "reconfigured", name, old_value);
|
| } else {
|
| - Handle<Object> newValue = Object::GetElement(self, index);
|
| - if (!newValue->SameValue(*old_value))
|
| + Handle<Object> new_value = Object::GetElement(self, index);
|
| + if (!new_value->SameValue(*old_value))
|
| EnqueueChangeRecord(self, "updated", name, old_value);
|
| }
|
| }
|
|
|