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