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