// 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);