| function assert(b) { |
| if (!b) |
| throw new Error("bad assertion"); |
| } |
| noInline(assert); |
| |
| |
| let i; |
| var o1 = { |
| set f(v) { |
| if (i === -1000) |
| throw new Error("hello"); |
| this._v = v; |
| } |
| }; |
| |
| 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) { |
| let o = bar(i); |
| let v = o.x; |
| try { |
| o.f = v; |
| } 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); |