blob: 25acfea846ce13d7f06ef549dc3f08a654b521d3 [file] [log] [blame]
// If there is no window.gc() already defined, define one using the best
// method we can find.
// The slow fallback should not hit in the actual test environment.
if (!window.gc)
{
window.gc = function()
{
if (window.GCController)
return GCController.collectAll();
function gcRec(n) {
if (n < 1)
return {};
var temp = {i: "ab" + i + (i / 100000)};
temp += "foo";
gcRec(n-1);
}
for (var i = 0; i < 10000; i++)
gcRec(10);
}
}
function checkForGCController() {
if (typeof GCController === "undefined")
throw "Specific GC operations only supported when running with " +
"--expose-gc in V8."
}
// With Oilpan tests that rely on garbage collection need to go through
// the event loop in order to get precise garbage collections. Oilpan
// uses conservative stack scanning when not at the event loop and that
// can artificially keep objects alive. Therefore, tests that need to check
// that something is dead need to use this asynchronous collectGarbage
// function.
function asyncGC(callback) {
checkForGCController();
if (!callback) {
return new Promise(resolve => asyncGC(resolve));
}
const documentsBefore = internals.numberOfLiveDocuments();
GCController.asyncCollectAll(function () {
const documentsAfter = internals.numberOfLiveDocuments();
if (documentsAfter < documentsBefore) {
asyncGC(callback);
} else {
callback();
}
});
}
function asyncMinorGC(callback) {
checkForGCController();
GCController.minorCollect();
// FIXME: we need a better way of waiting for chromium events to happen.
setTimeout(callback, 0);
}