function foo(o) { return o.f + 1; } noInline(foo); var shouldThrow = false; function makeWithGetter() { var o = {}; o.__defineGetter__("f", function() { if (shouldThrow) throw "hello"; return 42; }); return o; } for (var i = 0; i < 100000; ++i) { var result = foo({f:23}); if (result != 24) throw "Error: bad result: " + result; result = foo(makeWithGetter()); if (result != 43) throw "Error: bad result: " + result; } var didThrow; try { shouldThrow = true; foo(makeWithGetter()); } catch (e) { didThrow = e; } if (didThrow != "hello") throw "Error: didn't throw or threw wrong exception: " + didThrow;