// Debugger.Memory.prototype.takeCensus behaves plausibly as we allocate objects. // Exact object counts vary in ways we can't predict. For example, // BaselineScripts can hold onto "template objects", which exist only to hold // the shape and type for newly created objects. When BaselineScripts are // discarded, these template objects go with them. // // So instead of expecting precise counts, we expect counts that are at least as // many as we would expect given the object graph we've built. load(libdir + 'census.js'); // A Debugger with no debuggees had better not find anything. var dbg = new Debugger; var census0 = dbg.memory.takeCensus(); Census.walkCensus(census0, "census0", Census.assertAllZeros); function newGlobalWithDefs() { var g = newGlobal(); g.eval(` function times(n, fn) { var a=[]; for (var i = 0; i<n; i++) a.push(fn()); return a; }`); return g; } // Allocate a large number of various types of objects, and check that census // finds them. var g = newGlobalWithDefs(); dbg.addDebuggee(g); g.eval('var objs = times(100, () => ({}));'); g.eval('var rxs = times(200, () => /foo/);'); g.eval('var ars = times(400, () => []);'); g.eval('var fns = times(800, () => () => {});'); var census1 = dbg.memory.takeCensus(); Census.walkCensus(census1, "census1", Census.assertAllNotLessThan( { 'objects': { 'Object': { count: 100 }, 'RegExp': { count: 200 }, 'Array': { count: 400 }, 'Function': { count: 800 } } }));