void js_DestroyContext(JSContext *cx) { JSRuntime *rt; JSBool rtempty; rt = cx->runtime; PR_ASSERT(JS_IS_RUNTIME_LOCKED(rt)); /* Remove cx from context list first. */ PR_REMOVE_LINK(&cx->links); rtempty = (rt->contextList.next == (PRCList *)&rt->contextList); if (js_InterpreterHooks && js_InterpreterHooks->destroyContext) { /* This is a stub, but in case it removes roots, call it now. */ js_InterpreterHooks->destroyContext(cx); } if (rtempty) { /* No more contexts: clear debugging state to remove GC roots. */ JS_ClearAllTraps(cx); JS_ClearAllWatchPoints(cx); } /* Remove more GC roots in regExpStatics, then collect garbage. */ #if JS_HAS_REGEXPS js_FreeRegExpStatics(cx, &cx->regExpStatics); #endif js_ForceGC(cx); if (rtempty) { /* Free atom state now that we've run the GC. */ js_FreeAtomState(cx, &rt->atomState); } /* Free the stuff hanging off of cx. */ PR_FinishArenaPool(&cx->stackPool); PR_FinishArenaPool(&cx->codePool); PR_FinishArenaPool(&cx->tempPool); if (cx->lastMessage) free(cx->lastMessage); free(cx); }
/* XXX - need to zeroize!! - jsw */ void PORT_FreeArena(PRArenaPool *arena, PRBool zero) { PR_FinishArenaPool(arena); PORT_Free(arena); }