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; | |
} |