function assert(b, m="") { if (!b) throw new Error("Bad assertion: " + m); } noInline(assert); let called = false; function baz(c) { if (c) { Array.prototype[Symbol.iterator] = function() { assert(false, "should not be called!"); let i = 0; return { next() { assert(false, "should not be called!"); } }; } } } noInline(baz); function bar(...args) { return args; } noInline(bar); function foo(c, ...args) { args = [...args]; baz(c); return bar.apply(null, args); } noInline(foo); function test(c) { 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]); } noInline(test); for (let i = 0; i < 40000; i++) { test(false); } test(true);