Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 // getLineOffsets works with instructions reachable only by breaking out of a loop or switch.
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 };
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 }
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");
41 test("while (true)\n" +
42 " if (++i === 2) break;\n");
44 test("do {\n" +
45 " if (++i === 2) break;\n" +
46 "} while (true);\n");
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");