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