summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/debug/Debugger-onNativeCall-02.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/debug/Debugger-onNativeCall-02.js')
-rw-r--r--js/src/jit-test/tests/debug/Debugger-onNativeCall-02.js61
1 files changed, 61 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/debug/Debugger-onNativeCall-02.js b/js/src/jit-test/tests/debug/Debugger-onNativeCall-02.js
new file mode 100644
index 0000000000..9e372d179a
--- /dev/null
+++ b/js/src/jit-test/tests/debug/Debugger-onNativeCall-02.js
@@ -0,0 +1,61 @@
+// Test that the onNativeCall hook can control the call's behavior.
+
+var g = newGlobal({newCompartment: true});
+var dbg = Debugger(g);
+var gdbg = dbg.addDebuggee(g);
+
+g.eval(`
+var x = [];
+Object.defineProperty(x, "a", {
+ get: print,
+ set: print,
+});
+var rv;
+function f() {
+ x.a++;
+ try {
+ rv = x.push(4);
+ } catch (e) {
+ throw "rethrowing";
+ }
+}
+`);
+
+for (let i = 0; i < 5; i++) {
+ g.f();
+}
+
+for (let i = 0; i < 5; i++) {
+ // Test terminating execution.
+ dbg.onNativeCall = (callee, reason) => {
+ return null;
+ };
+ const len = g.x.length;
+ let v = gdbg.executeInGlobal(`f()`);
+ assertEq(v, null);
+ assertEq(g.x.length, len);
+
+ // Test throwing an exception.
+ dbg.onNativeCall = (callee, reason) => {
+ return { throw: "throwing" };
+ };
+ v = gdbg.executeInGlobal(`f()`);
+ assertEq(v.throw, "throwing");
+
+ // Test throwing an exception #2.
+ dbg.onNativeCall = (callee, reason) => {
+ if (callee.name == "push") {
+ return { throw: "throwing" };
+ }
+ };
+ v = gdbg.executeInGlobal(`f()`);
+ assertEq(v.throw, "rethrowing");
+
+ // Test returning a different value from the native.
+ dbg.onNativeCall = (callee, reason) => {
+ return { return: "value" };
+ };
+ v = gdbg.executeInGlobal(`f()`);
+ assertEq(v.return, undefined);
+ assertEq(g.rv, "value");
+}