blob: 0449493d08f190562375be3e3d83951a2cb63292 [file] [log] [blame]
// Test usage of drainTenurePromotionsLog() with multiple debuggers.
const root = newGlobal();
const dbg1 = new Debugger(root);
const dbg2 = new Debugger(root);
function setTracking(dbg, bool) {
dbg.memory.trackingAllocationSites = bool;
dbg.memory.trackingTenurePromotions = bool;
}
function tenureObjectsAndDrainLog() {
gc();
root.eval(
`
(function immediate() {
this.tests = [
{ name: "({})", cls: "Object", obj: ({}) },
{ name: "[]", cls: "Array", obj: [] },
{ name: "new Object", cls: "Object", obj: new Object() },
{ name: "new Array", cls: "Array", obj: new Array() },
{ name: "new Date", cls: "Date", obj: new Date() },
];
}());
minorgc();
`
);
const promotions2 = dbg2.memory.trackingTenurePromotions ? dbg2.memory.drainTenurePromotionsLog() : [];
const promotions1 = dbg1.memory.trackingTenurePromotions ? dbg1.memory.drainTenurePromotionsLog() : [];
setTracking(dbg1, false);
setTracking(dbg2, false);
return { promotions1, promotions2 };
}
{
setTracking(dbg1, true);
setTracking(dbg2, true);
const { promotions1, promotions2 } = tenureObjectsAndDrainLog();
// Should get logs in dbg1,
assertEq(!!promotions1.length, true);
// and logs in dbg2.
assertEq(!!promotions2.length, true);
}
{
setTracking(dbg1, false);
setTracking(dbg2, false);
const { promotions1, promotions2 } = tenureObjectsAndDrainLog();
// Should *not* get logs in dbg1,
assertEq(!!promotions1.length, false);
// nor logs in dbg2.
assertEq(!!promotions2.length, false);
}
{
setTracking(dbg1, true);
setTracking(dbg2, false);
const { promotions1, promotions2 } = tenureObjectsAndDrainLog();
// Should get logs in dbg1,
assertEq(!!promotions1.length, true);
// but *not* logs in dbg2.
assertEq(!!promotions2.length, false);
}
{
setTracking(dbg1, false);
setTracking(dbg2, true);
const { promotions1, promotions2 } = tenureObjectsAndDrainLog();
// Should *not* get logs in dbg1,
assertEq(!!promotions1.length, false);
// but *should* get logs in dbg2.
assertEq(!!promotions2.length, true);
}