Index: src/v8natives.js |
diff --git a/src/v8natives.js b/src/v8natives.js |
index e8752c84b8b1389dc30ac7315b394243d92fb947..3978e88685156e69ec1660f1ea76d2f8b845b3b9 100644 |
--- a/src/v8natives.js |
+++ b/src/v8natives.js |
@@ -893,16 +893,35 @@ function DefineArrayProperty(obj, p, desc, should_throw) { |
} |
// Make sure the below call to DefineObjectProperty() doesn't overwrite |
// any magic "length" property by removing the value. |
+ // TODO(mstarzinger): This hack should be removed once we have addressed the |
+ // respective TODO in Runtime_DefineOrRedefineDataProperty. |
+ // For the time being, we need a hack to prevent Object.observe from |
+ // generating two change records. |
+ var isObserved = %IsObserved(obj); |
+ if (isObserved) %SetIsObserved(obj, false); |
obj.length = new_length; |
desc.value_ = void 0; |
desc.hasValue_ = false; |
- if (!DefineObjectProperty(obj, "length", desc, should_throw) || threw) { |
+ threw = !DefineObjectProperty(obj, "length", desc, should_throw) || threw; |
+ if (isObserved) %SetIsObserved(obj, true); |
+ if (threw) { |
if (should_throw) { |
throw MakeTypeError("redefine_disallowed", [p]); |
} else { |
return false; |
} |
} |
+ if (isObserved) { |
+ var new_desc = GetOwnProperty(obj, "length"); |
+ var updated = length_desc.value_ !== new_desc.value_; |
+ var reconfigured = length_desc.writable_ !== new_desc.writable_ || |
+ length_desc.configurable_ !== new_desc.configurable_ || |
+ length_desc.enumerable_ !== new_desc.configurable_; |
+ if (updated || reconfigured) { |
+ NotifyChange(reconfigured ? "reconfigured" : "updated", |
+ obj, "length", length_desc.value_); |
+ } |
+ } |
return true; |
} |