| function truth() { |
| return true; |
| } |
| noInline(truth); |
| |
| function assert(cond) { |
| if (!cond) |
| throw new Error("broke assertion"); |
| } |
| |
| noInline(assert); |
| |
| ;(function() { |
| function foo() { |
| let x = 40; |
| with ({x : 100}) { |
| assert(x === 100); |
| } |
| with ({y : 100}) { |
| assert(x === 40); |
| } |
| } |
| noInline(foo); |
| |
| function bar() { |
| let x = 40; |
| function capX() { return x; } |
| with ({x : 100}) { |
| if (truth()) { |
| let x = 50; |
| let capX = function() { return x; } |
| assert(x === 50); |
| assert(capX() === x); |
| } |
| assert(x === 100); |
| assert(capX() === 40); |
| } |
| with ({y : 100}) { |
| if (truth()) { |
| let x = 50; |
| let capX = function() { return x; } |
| assert(x === 50); |
| assert(capX() === x); |
| } |
| assert(x === 40); |
| assert(capX() === 40); |
| } |
| } |
| noInline(bar); |
| |
| function baz() { |
| let x = 40; |
| function capX() { return x; } |
| with ({x : 100}) { |
| if (truth()) { |
| let x = 50; |
| assert(x === 50); |
| } |
| assert(x === 100); |
| assert(capX() === 40); |
| } |
| with ({y : 100}) { |
| if (truth()) { |
| let x = 50; |
| assert(x === 50); |
| } |
| assert(x === 40); |
| assert(capX() === 40); |
| } |
| } |
| noInline(baz); |
| |
| for (let i = 0; i < 100; i++) { |
| foo(); |
| bar(); |
| baz(); |
| } |
| })(); |