| function assert(b) { |
| if (!b) |
| throw new Error("Bad assertion"); |
| } |
| noInline(assert); |
| |
| function bar(...args) { |
| return args; |
| } |
| |
| function foo(a, ...args) { |
| try { |
| let r = bar(...args, ...args); |
| return r; |
| } catch(e) { |
| return a; |
| } |
| } |
| noInline(foo); |
| |
| for (let i = 0; i < 10000; i++) { |
| let args = []; |
| for (let i = 0; i < 400; i++) { |
| args.push(i); |
| } |
| |
| let o = {}; |
| let r = foo(o, ...args); |
| let i = 0; |
| for (let arg of args) { |
| assert(r[i] === arg); |
| i++; |
| } |
| for (let arg of args) { |
| assert(r[i] === arg); |
| i++; |
| } |
| } |
| |
| for (let i = 0; i < 20; i++) { |
| let threw = false; |
| let o = {}; |
| let args = []; |
| let argCount = maxArguments() * (2/3); |
| argCount = argCount | 0; |
| for (let i = 0; i < argCount; i++) { |
| args.push(i); |
| } |
| |
| let r = foo(o, ...args); |
| assert(r === o); |
| } |