void XPCJSRuntime::AddXPConnectRoots(JSContext* cx, nsCycleCollectionTraversalCallback &cb) { // For all JS objects that are held by native objects but aren't held // through rooting or locking, we need to add all the native objects that // hold them so that the JS objects are colored correctly in the cycle // collector. This includes JSContexts that don't have outstanding requests, // because their global object wasn't marked by the JS GC. All other JS // roots were marked by the JS GC and will be colored correctly in the cycle // collector. JSContext *iter = nsnull, *acx; while((acx = JS_ContextIterator(GetJSRuntime(), &iter))) { #ifndef DEBUG_CC // Only skip JSContexts with outstanding requests if DEBUG_CC is not // defined, else we do want to know about all JSContexts to get better // graphs and explanations. if(nsXPConnect::GetXPConnect()->GetRequestDepth(acx) != 0) continue; #endif cb.NoteRoot(nsIProgrammingLanguage::CPLUSPLUS, acx, nsXPConnect::JSContextParticipant()); } XPCWrappedNativeScope::SuspectAllWrappers(this, cx, cb); for(XPCRootSetElem *e = mVariantRoots; e ; e = e->GetNextRoot()) cb.NoteXPCOMRoot(static_cast<XPCTraceableVariant*>(e)); for(XPCRootSetElem *e = mWrappedJSRoots; e ; e = e->GetNextRoot()) { nsIXPConnectWrappedJS *wrappedJS = static_cast<nsXPCWrappedJS*>(e); cb.NoteXPCOMRoot(wrappedJS); } if(mJSHolders.ops) JS_DHashTableEnumerate(&mJSHolders, NoteJSHolder, &cb); }