| function assert(b) { |
| if (!b) |
| throw new Error; |
| } |
| |
| let called = false; |
| function defineSetter() { |
| Array.prototype.__defineSetter__(0, function (x) { |
| assert(x === 42); |
| called = true; |
| }); |
| } |
| |
| class DerivedArray extends Array { |
| constructor(...args) { |
| super() |
| } |
| } |
| |
| function iterate(a) { |
| for (let i = 0; i < a.length; i++) { } |
| } |
| |
| let arr = [[[1, 2, 3, 4, 5], [ 2], 5], [[1, 2, 3], [ -4]]]; |
| let d = new DerivedArray(); |
| d[1] = 20; |
| d[2] = 40; |
| arr.push([d, [2] -9]); |
| |
| function doSlice(a) { |
| let r = a.slice(); |
| defineSetter(); |
| return r; |
| } |
| |
| for (let i = 0; i < 10000; i++) { |
| for (let [a, b, ...c] of arr) { |
| let s = doSlice(a); |
| iterate(s); |
| delete s[0]; |
| called = false; |
| s[0] = 42; |
| if (a === d) { |
| assert(called); |
| called = false; |
| } |
| } |
| } |