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