summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/debug/onExceptionUnwind-18.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/debug/onExceptionUnwind-18.js')
-rw-r--r--js/src/jit-test/tests/debug/onExceptionUnwind-18.js58
1 files changed, 58 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/debug/onExceptionUnwind-18.js b/js/src/jit-test/tests/debug/onExceptionUnwind-18.js
new file mode 100644
index 0000000000..3d6cbe5fda
--- /dev/null
+++ b/js/src/jit-test/tests/debug/onExceptionUnwind-18.js
@@ -0,0 +1,58 @@
+// Test behavior of isInCatchScope on frame from loop iterator
+
+load(libdir + "asserts.js");
+
+var g = newGlobal({newCompartment: true});
+var dbg = Debugger(g);
+var hit = false;
+dbg.onExceptionUnwind = function (frame, exc) {
+ // onExceptionUnwind is called multiple times as the stack is unwound.
+ // Only check the first hit.
+ assertEq(frame instanceof Debugger.Frame, true);
+ assertEq(exc, 16);
+ if (!hit) {
+ hit = true;
+ {
+ assertEq(frame.type, "call");
+ assertEq(frame.callee.name, "foo");
+ assertEq(frame.older.type, "call");
+ const { lineNumber, columnNumber } = frame.script.getOffsetMetadata(frame.offset);
+ assertEq(lineNumber, 3);
+ assertEq(columnNumber, 4);
+
+ const isInCatchScope = frame.script.isInCatchScope(frame.offset);
+ assertEq(isInCatchScope, false);
+ }
+
+ {
+ const { older } = frame;
+ assertEq(older.type, "call");
+ assertEq(older.callee.name, "f");
+ assertEq(older.type, "call");
+ const { lineNumber, columnNumber } = older.script.getOffsetMetadata(older.offset);
+ assertEq(lineNumber, 8);
+ assertEq(columnNumber, 6);
+
+ const isInCatchScope = older.script.isInCatchScope(older.offset);
+ assertEq(isInCatchScope, true);
+ }
+ }
+};
+
+g.eval(
+`function f() {
+ function foo() {
+ throw 16; // <= first frame on exception is here
+ }
+
+ for (const _ of [1]) {
+ try {
+ foo(); // <= second frame, "older" is here
+ } catch (e) {
+ throw e;
+ }
+ }
+}
+`);
+assertThrowsValue(function () { g.eval("f();"); }, 16);
+assertEq(hit, true);