summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/debug/Debugger-adoptFrame.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/debug/Debugger-adoptFrame.js')
-rw-r--r--js/src/jit-test/tests/debug/Debugger-adoptFrame.js81
1 files changed, 81 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/debug/Debugger-adoptFrame.js b/js/src/jit-test/tests/debug/Debugger-adoptFrame.js
new file mode 100644
index 0000000000..f5a911fe6c
--- /dev/null
+++ b/js/src/jit-test/tests/debug/Debugger-adoptFrame.js
@@ -0,0 +1,81 @@
+// validate the common behavior of of Debugger.adoptFrame
+
+load(libdir + "asserts.js");
+
+const g = newGlobal({ newCompartment: true });
+
+const dbg1 = new Debugger();
+const gDO1 = dbg1.addDebuggee(g);
+
+let suspendedFrame;
+dbg1.onDebuggerStatement = function() {
+ // Test working with an onStack frame.
+ const frame1 = dbg1.getNewestFrame();
+
+ const dbg = new Debugger();
+ assertErrorMessage(
+ () => dbg.adoptFrame(frame1),
+ Error,
+ "Debugger.Frame's global is not a debuggee"
+ );
+
+ dbg.addDebuggee(g);
+
+ const frame2 = dbg.adoptFrame(frame1);
+
+ assertMatchingFrame(frame1, frame2);
+
+ suspendedFrame = frame1;
+};
+const generator = g.eval(`
+function* fn() {
+ debugger;
+ yield;
+}
+fn();
+`);
+generator.next();
+
+(function() {
+ // Test working with a suspended generator frame.
+ const dbg = new Debugger();
+ assertErrorMessage(
+ () => dbg.adoptFrame(suspendedFrame),
+ Error,
+ "Debugger.Frame's global is not a debuggee"
+ );
+
+ dbg.addDebuggee(g);
+
+ const frame2 = dbg.adoptFrame(suspendedFrame);
+
+ assertMatchingFrame(frame2, suspendedFrame);
+})();
+
+generator.next();
+const deadFrame = suspendedFrame;
+
+(function() {
+ // Test working with a dead frame.
+ const dbg = new Debugger();
+
+ // This doesn't throw because the dead frame doesn't have any
+ // debuggee-specific data associated with it anymore.
+ dbg.adoptFrame(deadFrame);
+
+ dbg.addDebuggee(g);
+
+ const frame2 = dbg.adoptFrame(deadFrame);
+
+ assertMatchingFrame(frame2, deadFrame);
+})();
+
+function assertMatchingFrame(frame1, frame2) {
+ assertEq(frame2.onStack, frame1.onStack);
+ assertEq(frame2.terminated, frame1.terminated);
+
+ if (!frame2.terminated) {
+ assertEq(frame2.type, frame1.type);
+ assertEq(frame2.offset, frame1.offset);
+ }
+}