summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/debug/Memory-takeCensus-09.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/debug/Memory-takeCensus-09.js')
-rw-r--r--js/src/jit-test/tests/debug/Memory-takeCensus-09.js74
1 files changed, 74 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/debug/Memory-takeCensus-09.js b/js/src/jit-test/tests/debug/Memory-takeCensus-09.js
new file mode 100644
index 000000000..09b28da34
--- /dev/null
+++ b/js/src/jit-test/tests/debug/Memory-takeCensus-09.js
@@ -0,0 +1,74 @@
+// Debugger.Memory.prototype.takeCensus: by: allocationStack breakdown
+
+var g = newGlobal();
+var dbg = new Debugger(g);
+
+g.evaluate(`
+ var log = [];
+ function f() { log.push(allocationMarker()); }
+ function g() { f(); }
+ function h() { f(); }
+ `,
+ { fileName: "Rockford", lineNumber: 1000 });
+
+// Create one allocationMarker with tracking turned off,
+// so it will have no associated stack.
+g.f();
+
+dbg.memory.allocationSamplingProbability = 1;
+dbg.memory.trackingAllocationSites = true;
+
+for ([f, n] of [[g.f, 20], [g.g, 10], [g.h, 5]])
+ for (let i = 0; i < n; i++)
+ f(); // all allocations of allocationMarker occur with this line as the
+ // oldest stack frame.
+
+let census = dbg.memory.takeCensus({ breakdown: { by: 'objectClass',
+ then: { by: 'allocationStack',
+ then: { by: 'count',
+ label: 'haz stack'
+ },
+ noStack: { by: 'count',
+ label: 'no haz stack'
+ }
+ }
+ }
+ });
+
+let map = census.AllocationMarker;
+assertEq(map instanceof Map, true);
+
+// Gather the stacks we are expecting to appear as keys, and
+// check that there are no unexpected keys.
+let stacks = { };
+
+map.forEach((v, k) => {
+ if (k === 'noStack') {
+ // No need to save this key.
+ } else if (k.functionDisplayName === 'f' &&
+ k.parent.functionDisplayName === null) {
+ stacks.f = k;
+ } else if (k.functionDisplayName === 'f' &&
+ k.parent.functionDisplayName === 'g' &&
+ k.parent.parent.functionDisplayName === null) {
+ stacks.fg = k;
+ } else if (k.functionDisplayName === 'f' &&
+ k.parent.functionDisplayName === 'h' &&
+ k.parent.parent.functionDisplayName === null) {
+ stacks.fh = k;
+ } else {
+ assertEq(true, false);
+ }
+});
+
+assertEq(map.get('noStack').label, 'no haz stack');
+assertEq(map.get('noStack').count, 1);
+
+assertEq(map.get(stacks.f).label, 'haz stack');
+assertEq(map.get(stacks.f).count, 20);
+
+assertEq(map.get(stacks.fg).label, 'haz stack');
+assertEq(map.get(stacks.fg).count, 10);
+
+assertEq(map.get(stacks.fh).label, 'haz stack');
+assertEq(map.get(stacks.fh).count, 5);