| function assert(b) { |
| if (!b) |
| throw new Error("Bad!"); |
| } |
| noInline(assert); |
| |
| function f1() { return "f1"; } |
| noInline(f1); |
| function f2() { return "f2"; } |
| noInline(f2); |
| function f3() { return "f3"; } |
| noInline(f3); |
| |
| let oException = { |
| valueOf() { throw new Error(""); } |
| }; |
| |
| function foo(arg1, arg2) { |
| let a = f1(); |
| let b = f2(); |
| let c = f3(); |
| try { |
| arg1 + arg2; |
| } catch(e) { |
| assert(arg1 === oException); |
| assert(arg2 === oException); |
| } |
| assert(a === "f1"); |
| assert(b === "f2"); |
| assert(c === "f3"); |
| } |
| noInline(foo); |
| |
| for (let i = 0; i < 1000; i++) { |
| foo(i, {}); |
| foo({}, i); |
| } |
| foo(oException, oException); |
| for (let i = 0; i < 10000; i++) { |
| foo(i, {}); |
| foo({}, i); |
| } |
| foo(oException, oException); |
| |
| |
| function ident(x) { return x; } |
| noInline(ident); |
| |
| function bar(arg1, arg2) { |
| let a = f1(); |
| let b = f2(); |
| let c = f3(); |
| let x = ident(arg1); |
| let y = ident(arg2); |
| |
| try { |
| arg1 + arg2; |
| } catch(e) { |
| assert(arg1 === oException); |
| assert(arg2 === oException); |
| assert(x === oException); |
| assert(y === oException); |
| } |
| assert(a === "f1"); |
| assert(b === "f2"); |
| assert(c === "f3"); |
| } |
| noInline(bar); |
| |
| for (let i = 0; i < 1000; i++) { |
| bar(i, {}); |
| bar({}, i); |
| } |
| bar(oException, oException); |
| for (let i = 0; i < 10000; i++) { |
| bar(i, {}); |
| bar({}, i); |
| } |
| bar(oException, oException); |