summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/debug/Debugger-setInstrumentation-06.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--js/src/jit-test/tests/debug/Debugger-setInstrumentation-06.js105
1 files changed, 105 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/debug/Debugger-setInstrumentation-06.js b/js/src/jit-test/tests/debug/Debugger-setInstrumentation-06.js
new file mode 100644
index 0000000000..14b97e5f81
--- /dev/null
+++ b/js/src/jit-test/tests/debug/Debugger-setInstrumentation-06.js
@@ -0,0 +1,105 @@
+// Test instrumentation on property and element accesses.
+
+load(libdir + 'eqArrayHelper.js');
+
+var g = newGlobal({ newCompartment: true });
+var dbg = Debugger(g);
+var gdbg = dbg.addDebuggee(g);
+
+function setScriptId(script) {
+ script.setInstrumentationId(0);
+ script.getChildScripts().forEach(setScriptId);
+}
+
+dbg.onNewScript = setScriptId;
+
+function getOffsetLine(scriptId, offset) {
+ const script = allScripts[scriptId];
+ return script.getOffsetMetadata(offset).lineNumber;
+}
+
+const executedOperations = [];
+
+function propertyRead(script, offset, obj, prop) {
+ executedOperations.push(`read:${obj.label}:${prop}`);
+}
+
+function propertyWrite(script, offset, obj, prop, rhs) {
+ executedOperations.push(`write:${obj.label}:${prop}:${typeof rhs}`);
+}
+
+function callback(kind, ...args) {
+ switch (kind) {
+ case "getProperty":
+ case "getElement":
+ propertyRead(...args);
+ break;
+ case "setProperty":
+ case "setElement":
+ propertyWrite(...args);
+ }
+}
+
+gdbg.setInstrumentation(
+ gdbg.makeDebuggeeValue(callback),
+ ["getProperty", "getElement", "setProperty", "setElement"]
+);
+
+function testFunction(fn, expected) {
+ gdbg.setInstrumentationActive(true);
+ for (var i = 0; i < 5; i++) {
+ executedOperations.length = 0;
+ fn();
+ assertEqArray(executedOperations, expected);
+ }
+ gdbg.setInstrumentationActive(false);
+}
+
+g.eval(`
+function basic(o, i) {
+ o.x = o.x + 1;
+ o[i] = o[i] + 1;
+}
+`);
+
+testFunction(() => g.basic({ label: 0}, 3), [
+ "read:0:x",
+ "write:0:x:number",
+ "read:0:3",
+ "write:0:3:number",
+]);
+
+g.eval(`
+function incdec(o, i) {
+ o.x++;
+ o[i]++;
+}
+`);
+
+testFunction(() => g.incdec({ label: 0}, 3), [
+ "read:0:x",
+ "write:0:x:number",
+ "read:0:3",
+ "write:0:3:number",
+]);
+
+g.eval(`
+function destructure({ f, g }) {
+ const { h, i } = f;
+}
+`);
+
+testFunction(() => g.destructure({ label: 0, f: { label: 1 }}, 3), [
+ "read:0:f",
+ "read:0:g",
+ "read:1:h",
+ "read:1:i",
+]);
+
+g.eval(`
+function destructureArray([a, b]) {}
+`);
+
+// Array destructuring uses iterators instead of getElement accesses,
+// and no property accesses will be captured by instrumentation.
+testFunction(() => g.destructureArray([1, 2]), []);