|
1 // getLineOffsets works with instructions reachable only by breaking out of a loop or switch. |
|
2 |
|
3 var g = newGlobal(); |
|
4 g.line0 = null; |
|
5 var dbg = Debugger(g); |
|
6 var where; |
|
7 dbg.onDebuggerStatement = function (frame) { |
|
8 var s = frame.eval("f").return.script; |
|
9 var lineno = g.line0 + where; |
|
10 var offs = s.getLineOffsets(lineno); |
|
11 for (var i = 0; i < offs.length; i++) { |
|
12 assertEq(s.getOffsetLine(offs[i]), lineno); |
|
13 s.setBreakpoint(offs[i], {hit: function () { g.log += 'B'; }}); |
|
14 } |
|
15 g.log += 'A'; |
|
16 }; |
|
17 |
|
18 function test(s) { |
|
19 var count = (s.split(/\n/).length - 1); // number of newlines in s |
|
20 g.log = ''; |
|
21 where = 3 + count + 1; |
|
22 g.eval("line0 = Error().lineNumber;\n" + |
|
23 "debugger;\n" + // line0 + 1 |
|
24 "function f(i) {\n" + // line0 + 2 |
|
25 s + // line0 + 3 ... line0 + where - 2 |
|
26 " log += '?';\n" + // line0 + where - 1 |
|
27 " log += '!';\n" + // line0 + where |
|
28 "}\n"); |
|
29 g.f(0); |
|
30 assertEq(g.log, 'A?B!'); |
|
31 } |
|
32 |
|
33 test("i = 128;\n" + |
|
34 "for (;;) {\n" + |
|
35 " var x = i - 10;;\n" + |
|
36 " if (x < 0)\n" + |
|
37 " break;\n" + |
|
38 " i >>= 2;\n" + |
|
39 "}\n"); |
|
40 |
|
41 test("while (true)\n" + |
|
42 " if (++i === 2) break;\n"); |
|
43 |
|
44 test("do {\n" + |
|
45 " if (++i === 2) break;\n" + |
|
46 "} while (true);\n"); |
|
47 |
|
48 test("switch (i) {\n" + |
|
49 " case 2: return 7;\n" + |
|
50 " case 1: return 8;\n" + |
|
51 " case 0: break;\n" + |
|
52 " default: return -i;\n" + |
|
53 "}\n"); |