function assert(b) { | |
if (!b) throw new Error("b"); | |
} | |
noInline(assert); | |
let i; | |
var o1 = { | |
get f() { | |
if (i === -1000) | |
throw new Error("hello"); | |
return 20; | |
} | |
}; | |
var o2 = { | |
f: 40 | |
} | |
var o3 = { | |
x: 100, | |
f: 50 | |
} | |
function bar(i) { | |
if (i === -1000) | |
return o1; | |
if (i % 2) | |
return o3; | |
else | |
return o2; | |
} | |
noInline(bar); | |
function foo(i) { | |
var o = bar(i); | |
var v; | |
try { | |
v = o.f | |
} catch(e) { | |
assert(o === o1); | |
} | |
} | |
noInline(foo); | |
foo(i); | |
for (i = 0; i < 1000; i++) | |
foo(i); | |
i = -1000; | |
for (let j = 0; j < 1000; j++) | |
foo(i); |