function assert(b) { | |
if (!b) | |
throw new Error("Bad assertion"); | |
} | |
noInline(assert); | |
let called = false; | |
function baz(c) { | |
if (c) { | |
Array.prototype[Symbol.iterator] = function() { | |
let i = 0; | |
return { | |
next() { | |
i++; | |
if (i === 2) | |
return {done: true}; | |
return {value: 40, done: false}; | |
} | |
}; | |
} | |
} | |
} | |
noInline(baz); | |
function bar(...args) { | |
return args; | |
} | |
noInline(bar); | |
function foo(c, ...args) { | |
baz(c); | |
return bar(...args); | |
} | |
noInline(foo); | |
for (let i = 0; i < 10000; i++) { | |
const c = false; | |
const args = [{}, 20, [], 45]; | |
let r = foo(c, ...args); | |
assert(r.length === r.length); | |
for (let i = 0; i < r.length; i++) | |
assert(r[i] === args[i]); | |
} | |
const c = true; | |
const args = [{}, 20, [], 45]; | |
let r = foo(c, ...args); | |
assert(r.length === 1); | |
assert(r[0] === 40); |