| 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 r = bar(...args, baz(a), ...args); |
| if (value) { |
| effects(); |
| } |
| 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); |