summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/debug/Memory-trackingAllocationSites-03.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/debug/Memory-trackingAllocationSites-03.js')
-rw-r--r--js/src/jit-test/tests/debug/Memory-trackingAllocationSites-03.js105
1 files changed, 105 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/debug/Memory-trackingAllocationSites-03.js b/js/src/jit-test/tests/debug/Memory-trackingAllocationSites-03.js
new file mode 100644
index 000000000..4770537cc
--- /dev/null
+++ b/js/src/jit-test/tests/debug/Memory-trackingAllocationSites-03.js
@@ -0,0 +1,105 @@
+// Test that multiple Debuggers behave reasonably.
+
+load(libdir + "asserts.js");
+
+let dbg1, dbg2, root1, root2;
+
+function isTrackingAllocations(global, dbgObj) {
+ const site = dbgObj.makeDebuggeeValue(global.eval("({})")).allocationSite;
+ if (site) {
+ assertEq(typeof site, "object");
+ }
+ return !!site;
+}
+
+function test(name, fn) {
+ print();
+ print(name);
+
+ // Reset state.
+ root1 = newGlobal();
+ root2 = newGlobal();
+ dbg1 = new Debugger;
+ dbg2 = new Debugger;
+
+ // Run the test.
+ fn();
+
+ print(" OK");
+}
+
+test("Can track allocations even if a different debugger is already tracking " +
+ "them.",
+ () => {
+ let d1r1 = dbg1.addDebuggee(root1);
+ let d2r1 = dbg2.addDebuggee(root1);
+ dbg1.memory.trackingAllocationSites = true;
+ dbg2.memory.trackingAllocationSites = true;
+ assertEq(isTrackingAllocations(root1, d1r1), true);
+ assertEq(isTrackingAllocations(root1, d2r1), true);
+ });
+
+test("Removing root1 as a debuggee from all debuggers should disable the " +
+ "allocation hook.",
+ () => {
+ dbg1.memory.trackingAllocationSites = true;
+ let d1r1 = dbg1.addDebuggee(root1);
+ dbg1.removeAllDebuggees();
+ assertEq(isTrackingAllocations(root1, d1r1), false);
+ });
+
+test("Adding a new debuggee to a debugger that is tracking allocations should " +
+ "enable the hook for the new debuggee.",
+ () => {
+ dbg1.memory.trackingAllocationSites = true;
+ let d1r1 = dbg1.addDebuggee(root1);
+ assertEq(isTrackingAllocations(root1, d1r1), true);
+ });
+
+test("Setting trackingAllocationSites to true should throw if the debugger " +
+ "cannot install the allocation hooks for *every* debuggee.",
+ () => {
+ let d1r1 = dbg1.addDebuggee(root1);
+ let d1r2 = dbg1.addDebuggee(root2);
+
+ // Can't install allocation hooks for root2 with this set.
+ root2.enableShellAllocationMetadataBuilder();
+
+ assertThrowsInstanceOf(() => dbg1.memory.trackingAllocationSites = true,
+ Error);
+
+ // And after it throws, its trackingAllocationSites accessor should reflect that
+ // allocation site tracking is still disabled in that Debugger.
+ assertEq(dbg1.memory.trackingAllocationSites, false);
+ assertEq(isTrackingAllocations(root1, d1r1), false);
+ assertEq(isTrackingAllocations(root2, d1r2), false);
+ });
+
+test("A Debugger isn't tracking allocation sites when disabled.",
+ () => {
+ dbg1.memory.trackingAllocationSites = true;
+ let d1r1 = dbg1.addDebuggee(root1);
+
+ assertEq(isTrackingAllocations(root1, d1r1), true);
+ dbg1.enabled = false;
+ assertEq(isTrackingAllocations(root1, d1r1), false);
+ });
+
+test("Re-enabling throws an error if we can't reinstall allocations tracking " +
+ "for all debuggees.",
+ () => {
+ dbg1.enabled = false
+ dbg1.memory.trackingAllocationSites = true;
+ let d1r1 = dbg1.addDebuggee(root1);
+ let d1r2 = dbg1.addDebuggee(root2);
+
+ // Can't install allocation hooks for root2 with this set.
+ root2.enableShellAllocationMetadataBuilder();
+
+ assertThrowsInstanceOf(() => dbg1.enabled = true,
+ Error);
+
+ assertEq(dbg1.enabled, false);
+ assertEq(isTrackingAllocations(root1, d1r1), false);
+ assertEq(isTrackingAllocations(root2, d1r2), false);
+ });