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