Script-getLineOffsets-04.js (1549B)
1 // getLineOffsets works with instructions reachable only by breaking out of a loop or switch. 2 3 var g = newGlobal({newCompartment: true}); 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.getOffsetLocation(offs[i]).lineNumber, 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");