function assert(b) { | |
if (!b) | |
throw new Error("bad value") | |
} | |
noInline(assert); | |
function random() { | |
return "blah"; | |
} | |
noInline(random); | |
function identity(x) { | |
return x; | |
} | |
noInline(identity); | |
let o1 = { | |
g: 20, | |
y: 40, | |
f: "get f" | |
}; | |
let o2 = { | |
g: "g", | |
y: "y", | |
get f() { | |
return "get f"; | |
} | |
} | |
let o4 = {}; | |
let o3 = { | |
get f() { | |
throw new Error("blah"); | |
} | |
} | |
function foo(o, a) { | |
let x = o.g; | |
let y = o.y; | |
let oo = identity(o); | |
let j = random(); | |
try { | |
j = o.f; | |
} catch(e) { | |
assert(j === "blah"); | |
assert(oo === o3); | |
return x + y + 1; | |
} | |
return x + y; | |
} | |
noInline(foo); | |
for (let i = 0; i < 100000; i++) { | |
if (i % 3 == 0) { | |
assert(foo(o1) === 60); | |
} else if (i % 3 === 1) { | |
assert(foo(o2) === "gy"); | |
} else { | |
foo(o4); | |
} | |
} | |
foo(o3); |