|
1 // Each resumption of an ES6 generator gets a fresh frame, whose onPop |
|
2 // handler fires the next time the generator yields. This is not the |
|
3 // behavior the spec requests, but it's what we do for the moment, and |
|
4 // it's good to check that at least we don't crash. |
|
5 |
|
6 load(libdir + 'iteration.js'); |
|
7 |
|
8 var g = newGlobal(); |
|
9 var dbg = new Debugger(g); |
|
10 var log; |
|
11 |
|
12 var debuggerFrames = []; |
|
13 var poppedFrames = []; |
|
14 dbg.onDebuggerStatement = function handleDebugger(frame) { |
|
15 log += 'd'; |
|
16 assertEq(frame.type, "call"); |
|
17 |
|
18 assertEq(debuggerFrames.indexOf(frame), -1); |
|
19 assertEq(poppedFrames.indexOf(frame), -1); |
|
20 debuggerFrames.push(frame); |
|
21 |
|
22 if (frame.eval('i').return % 3 == 0) { |
|
23 frame.onPop = function handlePop(c) { |
|
24 log += ')' + c.return.value; |
|
25 assertEq(debuggerFrames.indexOf(this) != -1, true); |
|
26 assertEq(poppedFrames.indexOf(this), -1); |
|
27 poppedFrames.push(this); |
|
28 }; |
|
29 } |
|
30 }; |
|
31 |
|
32 g.eval("function* g() { for (var i = 0; i < 10; i++) { debugger; yield i; } }"); |
|
33 log =''; |
|
34 g.eval("var t = 0, iter = g();"); |
|
35 for (var j = 0; j < 10; j++) |
|
36 g.eval("t += iter.next().value;"); |
|
37 assertIteratorResult(g.eval("iter.next()"), undefined, true); |
|
38 assertEq(g.eval("t"), 45); |
|
39 |
|
40 // FIXME: Should equal this, but see bug 917809. |
|
41 // assertEq(log, "d)0ddd)3ddd)6ddd)9"); |
|
42 assertEq(log, "d)undefinedddd)undefinedddd)undefinedddd)undefined"); |