| // FIXME: unskip when this is solved |
| // https://bugs.webkit.org/show_bug.cgi?id=191163 |
| //@ skip if ["arm", "mips", "x86"].include?($architecture) |
| function assert(b) { |
| if (!b) |
| throw new Error("Bad assertion"); |
| } |
| noInline(assert); |
| |
| function identity(a) { return a; } |
| noInline(identity); |
| |
| function bar(...args) { |
| return args; |
| } |
| noInline(bar); |
| |
| function foo(a, ...args) { |
| let arg = identity(a); |
| try { |
| let r = bar(...args, ...args); |
| return r; |
| } catch(e) { |
| return arg; |
| } |
| } |
| noInline(foo); |
| |
| for (let i = 0; i < 40000; 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); |
| } |