// Test that SavedFrame instances get removed from the SavedStacks frames cache // after a GC. const FUZZ_FACTOR = 3; function isAboutEq(actual, expected) { return Math.abs(actual - expected) <= FUZZ_FACTOR; } var stacks = []; (function () { // Use an IIFE here so that we don't keep these saved stacks alive in the // frame cache when we test that they all go away at the end of the test. var startCount = getSavedFrameCount(); print("startCount = " + startCount); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); stacks.push(saveStack()); gc(); var endCount = getSavedFrameCount(); print("endCount = " + endCount); assertEq(isAboutEq(endCount - startCount, 50), true); }()); while (stacks.length) { stacks.pop(); } gc(); stacks = null; gc(); assertEq(isAboutEq(getSavedFrameCount(), 0), true);