function assert(b) { if (!b) throw new Error("uh oh"); } let flag = false; let o = { valueOf() { if (flag) throw new Error("by by"); return 13.5; } }; noInline(o.valueOf); function baz() { return 1.5; } noInline(baz); function foo(x, o) { let r = baz(); try { r = x - o - r; } catch(e) { } return r; } noInline(foo); let x = 20.5; for (let i = 0; i < 10000; i++) { assert(foo(x, o) === 5.5); } flag = true; assert(foo(x, o) === 1.5); function bar(x, o) { let caughtException = false; var r = null; try { // This tests aliasing of left/right with result register in a SubGenerator // and ensures that the sub will spill the register properly and that we value // recover properly. r = x - o; } catch(e) { caughtException = true; assert(r === null); } if (!caughtException) assert(r === 7); return caughtException; } noInline(bar); flag = false; for (let i = 0; i < 10000; i++) { assert(bar(x, o) === false); } flag = true; assert(bar(x, o) === true);