"use strict"; function assert(b, m="") { if (!b) throw new Error("Bad assertion: " + m); } noInline(assert); function test1() { function bar(a, b, c, d) { return [a, b, c, d]; } function foo() { return bar(...[0, 1, 2, 3]); } noInline(foo); for (let i = 0; i < 10000; i++) { let [a, b, c, d] = foo(); assert(a === 0); assert(b === 1); assert(c === 2); assert(d === 3) ; } } function test2() { function bar(...args) { return args; } function foo() { let args = [1, 2, 3]; return bar(...args, 0, ...args); } noInline(foo); for (let i = 0; i < 10000; i++) { let r = foo(); assert(r.length === 7); let [a, b, c, d, e, f, g] = r; assert(a === 1); assert(b === 2); assert(c === 3); assert(d === 0); assert(e === 1); assert(f === 2); assert(g === 3); } } function test3() { function baz(...args) { return args; } function bar(...args) { return baz(...args); } function foo() { let args = [3]; return bar(...args, 0, ...args); } noInline(foo); for (let i = 0; i < 100000; i++) { let r = foo(); assert(r.length === 3); let [a, b, c] = r; assert(a === 3); assert(b === 0); assert(c === 3); } } function test4() { function baz(...args) { return args; } function bar(...args) { return baz(...args); } function foo() { let args = []; return bar(...args, 0, ...args); } noInline(foo); for (let i = 0; i < 100000; i++) { let r = foo(); assert(r.length === 1); assert(r[0] === 0); } } test1(); test2(); test3(); test4();