| var global = null; |
| |
| function foo(p, q) { |
| var o = {f:42}; |
| if (p) |
| global = o; |
| var tmp = q + 1; |
| return o.f + tmp; |
| } |
| |
| noInline(foo); |
| |
| var lastObject = null; |
| |
| function validateEscape(when) { |
| if (global === lastObject) |
| throw "Error: bad value in global " + when + ", identical to lastObject."; |
| if (global === null || !(typeof global == "object")) |
| throw "Error: bad value in global " + when + ": it's not an object."; |
| if (global.f != 42) |
| throw "Error: bad value in global " + when + ": f isn't 42, it's: " + global.f; |
| lastObject = global; |
| global = null; |
| } |
| |
| for (var i = 0; i < 10000; ++i) { |
| var escape = !!(i & 1); |
| var result = foo(escape, 42); |
| if (result != 42 + 42 + 1) |
| throw "Error: bad result: " + result; |
| if (escape) |
| validateEscape("in loop"); |
| else if (global !== null) |
| throw "Error: bad value in global: " + global; |
| } |
| |
| var result = foo(true, 2147483647); |
| if (result != 42 + 2147483647 + 1) |
| throw "Error: bad result at end: " + result; |
| validateEscape("at end"); |