| function assert(b) { |
| if (!b) |
| throw new Error("bad value") |
| } |
| noInline(assert); |
| |
| function random() { |
| return "blah"; |
| } |
| noInline(random); |
| |
| function foo(o, a) { |
| let x = o.g; |
| let y = o.y; |
| let j = random(); |
| try { |
| j = o.f; |
| } catch(e) { |
| assert(j === "blah"); |
| return x + y + 1; |
| } |
| return x + y; |
| } |
| |
| noInline(foo); |
| var flag = false; |
| function f(arg1, arg2, arg3) { |
| if (flag) |
| throw new Error("blah") |
| return arg1; |
| } |
| noInline(f); |
| let o1 = { |
| g: 20, |
| y: 40, |
| f: "get f" |
| }; |
| |
| let o2 = { |
| g: "g", |
| y: "y", |
| get f() { |
| if (flag) |
| throw new Error("blah"); |
| return "get f"; |
| } |
| } |
| |
| for (let i = 0; i < 100000; i++) { |
| if (i % 2) { |
| assert(foo(o1) === 60); |
| } else { |
| assert(foo(o2) === "gy"); |
| } |
| } |
| flag = true; |
| assert(foo(o2) === "gy1"); |