| function assert(b) { |
| if (!b) |
| throw new Error("Bad assertion."); |
| } |
| function foo(m) { |
| return [...m]; |
| } |
| noInline(foo); |
| |
| let map = new Map; |
| map.set(20, 30); |
| map.set(40, 50); |
| |
| let called = 0; |
| let customIterator = { |
| [Symbol.iterator]: function() { |
| called++; |
| let count = 0; |
| return { |
| next() { |
| called++; |
| count++; |
| if (count === 1) |
| return {done: false, value: [20, 30]}; |
| if (count === 2) |
| return {done: false, value: [40, 50]}; |
| return {done: true}; |
| } |
| }; |
| } |
| }; |
| for (let i = 0; i < 10000; i++) { |
| for (let o of [customIterator, map]) { |
| let [[a, b], [c, d]] = foo(o); |
| assert(a === 20); |
| assert(b === 30); |
| assert(c === 40); |
| assert(d === 50); |
| } |
| assert(called === 4); |
| called = 0; |
| } |
| |
| function bar(m) { |
| return [...m, ...m]; |
| } |
| noInline(bar); |
| for (let i = 0; i < 10000; i++) { |
| for (let o of [customIterator, map]) { |
| let [[a, b], [c, d], [e, f], [g, h]] = bar(o); |
| assert(a === 20); |
| assert(b === 30); |
| assert(c === 40); |
| assert(d === 50); |
| assert(e === 20); |
| assert(f === 30); |
| assert(g === 40); |
| assert(h === 50); |
| } |
| assert(called === 8); |
| called = 0; |
| } |