/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ // Test-only module in order to register objects later inspected by // the allocation tracker (in the same folder). // // We are going to store a weak reference to the passed objects, // in order to prevent holding them in memory. // Allocation tracker will then print detailed information // about why these objects are still allocated. const objects = []; /** * Request to track why the given object is kept in memory, * later on, when retrieving all the watched object via getStillAllocatedObjects. */ export function track(obj) { // We store a weak reference, so that we do force keeping the object in memory!! objects.push(Cu.getWeakReference(obj)); } /** * Return the reference and NodeId's of all the objects passed via `track()` method, * which are still hold in memory. * * NodeId's are used by spidermonkey memory API to designates JS objects in heap snapshots. */ export function getStillAllocatedObjects() { return ( objects // Filter out objects which have been freed already .filter(ref => !!ref.get()) .map(weakRef => { return { weakRef, // Convert objects from here instead of from allocation tracker in order // to be from the shared system compartment and avoid trying to compute the NodeId // of a wrapper! ubiNodeId: ChromeUtils.getObjectNodeId(weakRef.get()), }; }) ); } /** * Used by tests to clear all tracked objects */ export function clear() { objects.length = 0; }