function assert(b) { | |
if (!b) | |
throw new Error("Bad assertion!"); | |
} | |
noInline(assert); | |
let value = false; | |
function baz(x) { | |
if (typeof x !== "number") { | |
value = true; | |
} | |
return x; | |
} | |
noInline(baz); | |
function bar(...args) { | |
return args; | |
} | |
let didEffects = false; | |
function effects() { didEffects = true; } | |
noInline(effects); | |
function foo(a, ...args) { | |
let theArgs = [...args, a, ...args]; | |
baz(a); | |
if (value) { | |
effects(); | |
} | |
let r = bar.apply(null, theArgs); | |
return r; | |
} | |
noInline(foo); | |
for (let i = 0; i < 100000; i++) { | |
foo(i, i+1); | |
assert(!didEffects); | |
} | |
let o = {}; | |
let [a, b, c] = foo(o, 20); | |
assert(a === 20); | |
assert(b === o); | |
assert(c === 20); | |
assert(didEffects); |