| |
| function Foo(a, b) { |
| this.a = a; |
| this.b = b; |
| } |
| |
| function invalidate_foo() { |
| var a = []; |
| var counter = 0; |
| for (var i = 0; i < 50; i++) |
| a.push(new Foo(i, i + 1)); |
| Object.defineProperty(Foo.prototype, "a", {configurable: true, set: function() { counter++; }}); |
| for (var i = 0; i < 50; i++) |
| a.push(new Foo(i, i + 1)); |
| delete Foo.prototype.a; |
| var total = 0; |
| for (var i = 0; i < a.length; i++) { |
| assertEq('a' in a[i], i < 50); |
| total += a[i].b; |
| } |
| assertEq(total, 2550); |
| assertEq(counter, 50); |
| } |
| invalidate_foo(); |
| |
| function Bar(a, b, fn) { |
| this.a = a; |
| if (b == 30) |
| Object.defineProperty(Bar.prototype, "b", {configurable: true, set: fn}); |
| this.b = b; |
| } |
| |
| function invalidate_bar() { |
| var a = []; |
| var counter = 0; |
| function fn() { counter++; } |
| for (var i = 0; i < 50; i++) |
| a.push(new Bar(i, i + 1, fn)); |
| delete Bar.prototype.b; |
| var total = 0; |
| for (var i = 0; i < a.length; i++) { |
| assertEq('a' in a[i], true); |
| assertEq('b' in a[i], i < 29); |
| total += a[i].a; |
| } |
| assertEq(total, 1225); |
| assertEq(counter, 21); |
| } |
| invalidate_bar(); |