JS_ClearNewbornRoots(mJSContext);
if (!mJSContext->fp) JS_ClearNewbornRoots(mJSContext);
XPCCallContext::~XPCCallContext(){    NS_ASSERTION(mRefCnt == 0, "Someone is holding a bad reference to a XPCCallContext");    // do cleanup...    if(mXPCContext)    {        mXPCContext->SetCallingLangType(mPrevCallerLanguage);        if(mContextPopRequired)        {            XPCJSContextStack* stack = mThreadData->GetJSContextStack();            if(stack)            {#ifdef DEBUG                JSContext* poppedCX;                nsresult rv = stack->Pop(&poppedCX);                NS_ASSERTION(NS_SUCCEEDED(rv) && poppedCX == mJSContext, "bad pop");#else                (void) stack->Pop(nsnull);#endif            }            else            {                NS_ASSERTION(0, "bad!");            }        }#ifdef DEBUG        XPCCallContext* old = mThreadData->SetCallContext(mPrevCallContext);        NS_ASSERTION(old == this, "bad pop from per thread data");#else        (void) mThreadData->SetCallContext(mPrevCallContext);#endif    }    if(mJSContext)    {        if(mCallerLanguage == NATIVE_CALLER && JS_GetContextThread(mJSContext))            JS_EndRequest(mJSContext);                if(mDestroyJSContextInDestructor)        {#ifdef DEBUG_xpc_hacker            printf("!xpc - doing deferred destruction of JSContext @ %0x\n",                    mJSContext);#endif            NS_ASSERTION(!mThreadData->GetJSContextStack() ||                          !mThreadData->GetJSContextStack()->                            DEBUG_StackHasJSContext(mJSContext),                         "JSContext still in threadjscontextstack!");                    JS_DestroyContext(mJSContext);            mXPC->SyncJSContexts();        }        else        {            JS_ClearNewbornRoots(mJSContext);        }    }    NS_IF_RELEASE(mXPC);}