| // 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.enableShellObjectMetadataCallback(); |
| |
| 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.enableShellObjectMetadataCallback(); |
| |
| assertThrowsInstanceOf(() => dbg1.enabled = true, |
| Error); |
| |
| assertEq(dbg1.enabled, false); |
| assertEq(isTrackingAllocations(root1, d1r1), false); |
| assertEq(isTrackingAllocations(root2, d1r2), false); |
| }); |