| function assert(b) { |
| if (!b) |
| throw new Error("Bad assertion"); |
| } |
| noInline(assert); |
| var o = { |
| valueOf: function() { return {}; }, |
| toString: function() { return {}; } |
| }; |
| function read() { |
| return "read"; |
| } |
| noInline(read); |
| |
| function bar(a, b) { |
| return a == b; |
| } |
| |
| function foo(a, b) { |
| var result = null; |
| var value = read(); |
| try { |
| result = bar(a, b); |
| } catch(e) { |
| assert("" + value === "read"); |
| } |
| return value; |
| } |
| noInline(foo); |
| |
| for (var i = 0; i < 1000; i++) { |
| foo(10, 20); |
| foo({}, {}); |
| foo(10, 10.0); |
| foo("hello", "hello"); |
| foo(null, undefined); |
| foo(false, 0); |
| } |
| foo(o, "hello"); |