|
1 // When a recursive function has many frames on the stack, onStep may be set or |
|
2 // not independently on each frame. |
|
3 |
|
4 var g = newGlobal(); |
|
5 g.eval("function f(x) {\n" + |
|
6 " if (x > 0)\n" + |
|
7 " f(x - 1);\n" + |
|
8 " else\n" + |
|
9 " debugger;\n" + |
|
10 " return x;\n" + |
|
11 "}"); |
|
12 |
|
13 var dbg = Debugger(g); |
|
14 var seen = [0, 0, 0, 0, 0, 0, 0, 0]; |
|
15 function step() { |
|
16 seen[this.arguments[0]] = 1; |
|
17 } |
|
18 dbg.onEnterFrame = function (frame) { |
|
19 // Turn on stepping for even-numbered frames. |
|
20 var x = frame.arguments[0]; |
|
21 if (x % 2 === 0) |
|
22 frame.onStep = step; |
|
23 }; |
|
24 dbg.onDebuggerStatement = function (frame) { |
|
25 // This is called with 8 call frames on the stack, 7 down to 0. |
|
26 // At this point we should have seen all the even-numbered frames. |
|
27 assertEq(seen.join(""), "10101010"); |
|
28 |
|
29 // Now reset seen to see which frames fire onStep on the way out. |
|
30 seen = [0, 0, 0, 0, 0, 0, 0, 0]; |
|
31 }; |
|
32 |
|
33 g.f(7); |
|
34 assertEq(seen.join(""), "10101010"); |