js/src/jit-test/tests/debug/Script-getLineOffsets-06.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/js/src/jit-test/tests/debug/Script-getLineOffsets-06.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,99 @@
     1.4 +// getLineOffsets works with extended instructions, such as JSOP_GOTOX.
     1.5 +
     1.6 +var g = newGlobal();
     1.7 +g.line0 = null;
     1.8 +var dbg = Debugger(g);
     1.9 +var where;
    1.10 +dbg.onDebuggerStatement = function (frame) {
    1.11 +    var s = frame.script;
    1.12 +    var offs;
    1.13 +    var lineno = g.line0 + where;
    1.14 +    offs = s.getLineOffsets(lineno);
    1.15 +    for (var i = 0; i < offs.length; i++) {
    1.16 +        assertEq(s.getOffsetLine(offs[i]), lineno);
    1.17 +        s.setBreakpoint(offs[i], {hit: function (frame) { g.log += 'B'; }});
    1.18 +    }
    1.19 +    g.log += 'A';
    1.20 +};
    1.21 +
    1.22 +function test(s) {
    1.23 +    assertEq(s.charAt(s.length - 1) !== '\n', true);
    1.24 +    var count = s.split(/\n/).length;  // number of lines in s
    1.25 +    g.i = 0;
    1.26 +    g.log = '';
    1.27 +    where = 1 + count;
    1.28 +    g.eval("line0 = Error().lineNumber;\n" +
    1.29 +           "debugger;\n" +          // line0 + 1
    1.30 +           s +                      // line0 + 2 ... line0 + where
    1.31 +           " log += 'C';\n");
    1.32 +    assertEq(g.log, 'ABC');
    1.33 +}
    1.34 +
    1.35 +function repeat(s) {
    1.36 +    return Array((1 << 14) + 1).join(s);  // 16K copies of s
    1.37 +}
    1.38 +var long_expr = "i" + repeat(" + i");
    1.39 +var long_throw_stmt = "throw " + long_expr + ";\n";
    1.40 +
    1.41 +// long break (JSOP_GOTOX)
    1.42 +test("for (;;) {\n" +
    1.43 +     "    if (i === 0)\n" +
    1.44 +     "        break;\n" +
    1.45 +     "    " + long_throw_stmt +
    1.46 +     "}");
    1.47 +
    1.48 +// long continue (JSOP_GOTOX)
    1.49 +test("do {\n" +
    1.50 +     "    if (i === 0)\n" +
    1.51 +     "        continue;\n" +
    1.52 +     "    " + long_throw_stmt +
    1.53 +     "} while (i !== 0);");
    1.54 +
    1.55 +// long if consequent (JSOP_IFEQX)
    1.56 +test("if (i === 2) {\n" +
    1.57 +     "    " + long_throw_stmt +
    1.58 +     "}");
    1.59 +
    1.60 +// long catch-block with finally (JSOP_GOSUBX)
    1.61 +test("try {\n" +
    1.62 +     "    i = 0;\n" +
    1.63 +     "} catch (exc) {\n" +
    1.64 +     "    throw " + long_expr + ";\n" +
    1.65 +     "} finally {\n" +
    1.66 +     "    i = 1;\n" +
    1.67 +     "}");
    1.68 +
    1.69 +// long case (JSOP_TABLESWITCHX)
    1.70 +test("switch (i) {\n" +
    1.71 +     "  default:\n" +
    1.72 +     "  case 1: " + long_throw_stmt +
    1.73 +     "  case 0: i++; }");
    1.74 +
    1.75 +test("switch (i) {\n" +
    1.76 +     "  case 1: case 2: case 3: " + long_throw_stmt +
    1.77 +     "  default: i++; }");
    1.78 +
    1.79 +// long case (JSOP_LOOKUPSWITCHX)
    1.80 +test("switch ('' + i) {\n" +
    1.81 +     "  default:\n" +
    1.82 +     "  case '1': " + long_throw_stmt +
    1.83 +     "  case '0': i++; }");
    1.84 +
    1.85 +test("switch (i) {\n" +
    1.86 +     "  case '1': case '2': case '3': " + long_throw_stmt +
    1.87 +     "  default: i++; }");
    1.88 +
    1.89 +// long case or case-expression (JSOP_CASEX)
    1.90 +test("switch (i) {\n" +
    1.91 +     "  case i + 1 - i:\n" +
    1.92 +     "  default:\n" +
    1.93 +     "    " + long_throw_stmt +
    1.94 +     "  case i + i:\n" +
    1.95 +     "    i++; break; }");
    1.96 +
    1.97 +// long case when JSOP_CASE is used (JSOP_DEFAULTX)
    1.98 +test("switch (i) {\n" +
    1.99 +     "  case i + 1 - i:\n" +
   1.100 +     "    " + long_throw_stmt +
   1.101 +     "  default:\n" +
   1.102 +     "    i++; break; }");

mercurial