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