| // Test extracting frame.arguments element getters and calling them in |
| // various awkward ways. |
| |
| load(libdir + "asserts.js"); |
| |
| var g = newGlobal(); |
| var dbg = Debugger(g); |
| var hits = 0; |
| var fframe, farguments, fgetter; |
| dbg.onDebuggerStatement = function (frame) { |
| if (hits === 0) { |
| fframe = frame; |
| farguments = frame.arguments; |
| fgetter = Object.getOwnPropertyDescriptor(farguments, "0").get; |
| assertEq(fgetter instanceof Function, true); |
| |
| // Calling the getter without an appropriate this-object |
| // fails, but shouldn't assert or crash. |
| assertThrowsInstanceOf(function () { fgetter.call(Math); }, TypeError); |
| } else { |
| // Since fframe is still on the stack, fgetter can be applied to it. |
| assertEq(fframe.live, true); |
| assertEq(fgetter.call(farguments), 100); |
| |
| // Since h was called without arguments, there is no argument 0. |
| assertEq(fgetter.call(frame.arguments), undefined); |
| } |
| hits++; |
| }; |
| |
| g.eval("function h() { debugger; }"); |
| g.eval("function f(x) { debugger; h(); }"); |
| g.f(100); |
| assertEq(hits, 2); |
| |
| // Now that fframe is no longer live, trying to get its arguments should throw. |
| assertEq(fframe.live, false); |
| assertThrowsInstanceOf(function () { fgetter.call(farguments); }, Error); |