Bug 1026139 - Test. r=jimb, a=lmandel
authorShu-yu Guo <shu@rfrn.org>
Thu, 19 Jun 2014 12:22:11 -0700
changeset 208022 dba7b5fdea5c6e825251eea656731df86bc03eed
parent 208021 0bca394227a75948b90591d532b34a15ab8085fc
child 208023 0b9b4538e4a6362bfa38a6f3e5aed63f2713f7a4
push id3741
push userasasaki@mozilla.com
push dateMon, 21 Jul 2014 20:25:18 +0000
treeherdermozilla-beta@4d6f46f5af68 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjimb, lmandel
bugs1026139
milestone32.0a2
Bug 1026139 - Test. r=jimb, a=lmandel
js/src/jit-test/tests/debug/Debugger-debuggees-28.js
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/debug/Debugger-debuggees-28.js
@@ -0,0 +1,109 @@
+// Test that on->off->on and off->on->off toggles don't crash.
+
+function addRemove(dbg, g) {
+  dbg.addDebuggee(g);
+  var f = dbg.getNewestFrame();
+  while (f)
+    f = f.older;
+  dbg.removeDebuggee(g);
+}
+
+function removeAdd(dbg, g) {
+  dbg.removeDebuggee(g);
+  dbg.addDebuggee(g);
+  var f = dbg.getNewestFrame();
+  while (f)
+    f = f.older;
+}
+
+function newGlobalDebuggerPair(toggleSeq) {
+  var g = newGlobal();
+  var dbg = new Debugger;
+
+  if (toggleSeq == removeAdd)
+    dbg.addDebuggee(g);
+
+  g.eval("" + function f() { return g(); });
+  g.eval("" + function g() { return h(); });
+  g.eval("line0 = Error().lineNumber;");
+  g.eval("" + function h() {
+    for (var i = 0; i < 100; i++)
+      interruptIf(i == 95);
+    debugger;
+    return i;
+  });
+
+  setInterruptCallback(function () { return true; });
+
+  return [g, dbg];
+}
+
+function testInterrupt(toggleSeq) {
+  var [g, dbg] = newGlobalDebuggerPair(toggleSeq);
+
+  setInterruptCallback(function () {
+    toggleSeq(dbg, g);
+    return true;
+  });
+
+  assertEq(g.f(), 100);
+}
+
+function testPrologue(toggleSeq) {
+  var [g, dbg] = newGlobalDebuggerPair(toggleSeq);
+
+  dbg.onEnterFrame = function (f) {
+    if (f.callee && f.callee.name == "h")
+      toggleSeq(dbg, g);
+  };
+
+  assertEq(g.f(), 100);
+}
+
+function testEpilogue(toggleSeq) {
+  var [g, dbg] = newGlobalDebuggerPair(toggleSeq);
+
+  dbg.onEnterFrame = function (f) {
+    if (f.callee && f.callee.name == "h") {
+      f.onPop = function () {
+        toggleSeq(dbg, g);
+      };
+    }
+  };
+
+  assertEq(g.f(), 100);
+}
+
+function testTrap(toggleSeq) {
+  var [g, dbg] = newGlobalDebuggerPair(toggleSeq);
+
+  dbg.onEnterFrame = function (f) {
+    if (f.callee && f.callee.name == "h") {
+      var offs = f.script.getLineOffsets(g.line0 + 2);
+      assertEq(offs.length > 0, true);
+      f.script.setBreakpoint(offs[0], { hit: function () {
+        toggleSeq(dbg, g);
+      }});
+    }
+  };
+
+  assertEq(g.f(), 100);
+}
+
+function testDebugger(toggleSeq) {
+ var [g, dbg] = newGlobalDebuggerPair(toggleSeq);
+
+  dbg.onDebuggerStatement = function () {
+    toggleSeq(dbg, g);
+  };
+
+  assertEq(g.f(), 100);
+}
+
+testInterrupt(addRemove);
+testInterrupt(removeAdd);
+
+testPrologue(removeAdd);
+testEpilogue(removeAdd);
+testTrap(removeAdd);
+testDebugger(removeAdd);