void JSRuntime::addSizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf, JS::RuntimeSizes* rtSizes) { // Several tables in the runtime enumerated below can be used off thread. AutoLockForExclusiveAccess lock(this); // For now, measure the size of the derived class (JSContext). // TODO (bug 1281529): make memory reporting reflect the new // JSContext/JSRuntime world better. JSContext* cx = unsafeContextFromAnyThread(); rtSizes->object += mallocSizeOf(cx); rtSizes->atomsTable += atoms(lock).sizeOfIncludingThis(mallocSizeOf); if (!parentRuntime) { rtSizes->atomsTable += mallocSizeOf(staticStrings); rtSizes->atomsTable += mallocSizeOf(commonNames); rtSizes->atomsTable += permanentAtoms->sizeOfIncludingThis(mallocSizeOf); } rtSizes->contexts += cx->sizeOfExcludingThis(mallocSizeOf); rtSizes->temporary += tempLifoAlloc.sizeOfExcludingThis(mallocSizeOf); rtSizes->interpreterStack += interpreterStack_.sizeOfExcludingThis(mallocSizeOf); if (MathCache* cache = cx->caches.maybeGetMathCache()) rtSizes->mathCache += cache->sizeOfIncludingThis(mallocSizeOf); if (sharedImmutableStrings_) { rtSizes->sharedImmutableStringsCache += sharedImmutableStrings_->sizeOfExcludingThis(mallocSizeOf); } rtSizes->uncompressedSourceCache += cx->caches.uncompressedSourceCache.sizeOfExcludingThis(mallocSizeOf); rtSizes->scriptData += scriptDataTable(lock).sizeOfExcludingThis(mallocSizeOf); for (ScriptDataTable::Range r = scriptDataTable(lock).all(); !r.empty(); r.popFront()) rtSizes->scriptData += mallocSizeOf(r.front()); if (jitRuntime_) { jitRuntime_->execAlloc().addSizeOfCode(&rtSizes->code); jitRuntime_->backedgeExecAlloc().addSizeOfCode(&rtSizes->code); } rtSizes->gc.marker += gc.marker.sizeOfExcludingThis(mallocSizeOf); rtSizes->gc.nurseryCommitted += gc.nursery.sizeOfHeapCommitted(); rtSizes->gc.nurseryMallocedBuffers += gc.nursery.sizeOfMallocedBuffers(mallocSizeOf); gc.storeBuffer.addSizeOfExcludingThis(mallocSizeOf, &rtSizes->gc); }