Chromium Code Reviews| 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 |
|
Michael Starzinger
2012/12/12 15:34:05
Interesting, TODO with my name popping out of thin
|
| + // 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; |
| } |