diff --git a/xpcom/base/CycleCollectedJSRuntime.cpp b/xpcom/base/CycleCollectedJSRuntime.cpp index 434d8bcbd4fb..113f45ce1d54 100644 --- a/xpcom/base/CycleCollectedJSRuntime.cpp +++ b/xpcom/base/CycleCollectedJSRuntime.cpp @@ -433,6 +433,50 @@ mozilla::GetBuildId(JS::BuildIdCharVector* aBuildID) return true; } +struct ClearJSHolder : public TraceCallbacks +{ + virtual void Trace(JS::Heap* aPtr, const char*, void*) const override + { + aPtr->setUndefined(); + } + + virtual void Trace(JS::Heap* aPtr, const char*, void*) const override + { + *aPtr = JSID_VOID; + } + + virtual void Trace(JS::Heap* aPtr, const char*, void*) const override + { + *aPtr = nullptr; + } + + virtual void Trace(JSObject** aPtr, const char* aName, + void* aClosure) const override + { + *aPtr = nullptr; + } + + virtual void Trace(JS::TenuredHeap* aPtr, const char*, void*) const override + { + *aPtr = nullptr; + } + + virtual void Trace(JS::Heap* aPtr, const char*, void*) const override + { + *aPtr = nullptr; + } + + virtual void Trace(JS::Heap* aPtr, const char*, void*) const override + { + *aPtr = nullptr; + } + + virtual void Trace(JS::Heap* aPtr, const char*, void*) const override + { + *aPtr = nullptr; + } +}; + CycleCollectedJSRuntime::CycleCollectedJSRuntime() : mGCThingCycleCollectorGlobal(sGCThingCycleCollectorGlobal) , mJSZoneCycleCollectorGlobal(sJSZoneCycleCollectorGlobal) @@ -471,6 +515,14 @@ CycleCollectedJSRuntime::~CycleCollectedJSRuntime() MOZ_ASSERT(mDebuggerPromiseMicroTaskQueue.empty()); MOZ_ASSERT(mPromiseMicroTaskQueue.empty()); + for (auto iter = mJSHolders.Iter(); !iter.Done(); iter.Next()) { + void* holder = iter.Key(); + nsScriptObjectTracer*& tracer = iter.Data(); + tracer->Trace(holder, ClearJSHolder(), nullptr); + + } + mJSHolders.Clear(); + JS_DestroyRuntime(mJSRuntime); mJSRuntime = nullptr; nsCycleCollector_forgetJSRuntime(); @@ -1035,50 +1087,6 @@ CycleCollectedJSRuntime::AddJSHolder(void* aHolder, nsScriptObjectTracer* aTrace mJSHolders.Put(aHolder, aTracer); } -struct ClearJSHolder : public TraceCallbacks -{ - virtual void Trace(JS::Heap* aPtr, const char*, void*) const override - { - aPtr->setUndefined(); - } - - virtual void Trace(JS::Heap* aPtr, const char*, void*) const override - { - *aPtr = JSID_VOID; - } - - virtual void Trace(JS::Heap* aPtr, const char*, void*) const override - { - *aPtr = nullptr; - } - - virtual void Trace(JSObject** aPtr, const char* aName, - void* aClosure) const override - { - *aPtr = nullptr; - } - - virtual void Trace(JS::TenuredHeap* aPtr, const char*, void*) const override - { - *aPtr = nullptr; - } - - virtual void Trace(JS::Heap* aPtr, const char*, void*) const override - { - *aPtr = nullptr; - } - - virtual void Trace(JS::Heap* aPtr, const char*, void*) const override - { - *aPtr = nullptr; - } - - virtual void Trace(JS::Heap* aPtr, const char*, void*) const override - { - *aPtr = nullptr; - } -}; - void CycleCollectedJSRuntime::RemoveJSHolder(void* aHolder) {