Source code

Revision control

Copy as Markdown

Other Tools

// Check gray unmarking running as part of incremental GC correctly unmarks
// edges traced via virtual dispatch on the marking tracer.
function checkMarks(expected) {
assertEq(getMarks().join(", "), expected.join(", "));
}
gczeal(0);
gczeal('CheckGrayMarking');
gc();
let s = Symbol();
addMarkObservers([s]);
let m = new Map();
m.set({}, s);
addMarkObservers([m]);
grayRoot()[0] = m;
s = undefined;
m = undefined;
gc();
checkMarks(['gray', 'gray']);
schedulezone(this);
startgc(1);
while (gcstate() === 'Prepare') {
gcslice(10);
}
print(gcstate());
m = grayRoot()[0];
finishgc();
checkMarks(['black', 'black']);