diff --git a/js/public/GCAPI.h b/js/public/GCAPI.h index d3e0436de7ee..7327ba99b04a 100644 --- a/js/public/GCAPI.h +++ b/js/public/GCAPI.h @@ -481,9 +481,9 @@ typedef enum JSFinalizeStatus { typedef void (*JSFinalizeCallback)(JSFreeOp* fop, JSFinalizeStatus status, void* data); -typedef void (*JSWeakPointerZonesCallback)(JSTracer* trc, void* data); +typedef void (*JSWeakPointerZonesCallback)(JSContext* cx, void* data); -typedef void (*JSWeakPointerCompartmentCallback)(JSTracer* trc, +typedef void (*JSWeakPointerCompartmentCallback)(JSContext* cx, JS::Compartment* comp, void* data); diff --git a/js/public/GCPolicyAPI.h b/js/public/GCPolicyAPI.h index 744ecd1ea320..f4c1080fadfc 100644 --- a/js/public/GCPolicyAPI.h +++ b/js/public/GCPolicyAPI.h @@ -150,8 +150,8 @@ struct GCPolicy> { static void trace(JSTracer* trc, JS::Heap* thingp, const char* name) { TraceEdge(trc, thingp, name); } - static bool traceWeak(JSTracer* trc, JS::Heap* thingp) { - return *thingp && js::gc::TraceWeakEdge(trc, thingp); + static bool needsSweep(JS::Heap* thingp) { + return *thingp && js::gc::EdgeNeedsSweep(thingp); } }; diff --git a/js/public/TracingAPI.h b/js/public/TracingAPI.h index 1557a7700561..b4d8e77851f3 100644 --- a/js/public/TracingAPI.h +++ b/js/public/TracingAPI.h @@ -510,7 +510,7 @@ namespace gc { // Return true if the given edge is not live and is about to be swept. template -extern JS_PUBLIC_API bool TraceWeakEdge(JSTracer* trc, JS::Heap* thingp); +extern JS_PUBLIC_API bool EdgeNeedsSweep(JS::Heap* edgep); } // namespace gc diff --git a/js/src/gc/Compacting.cpp b/js/src/gc/Compacting.cpp index c150f4a06719..9843e3b3374b 100644 --- a/js/src/gc/Compacting.cpp +++ b/js/src/gc/Compacting.cpp @@ -802,7 +802,7 @@ void GCRuntime::updateZonePointersToRelocatedCells(Zone* zone) { // Call callbacks to get the rest of the system to fixup other untraced // pointers. for (CompartmentsInZoneIter comp(zone); !comp.done(); comp.next()) { - callWeakPointerCompartmentCallbacks(&trc, comp); + callWeakPointerCompartmentCallbacks(comp); } } @@ -848,7 +848,7 @@ void GCRuntime::updateRuntimePointersToRelocatedCells(AutoGCSession& session) { // Call callbacks to get the rest of the system to fixup other untraced // pointers. - callWeakPointerZonesCallbacks(&trc); + callWeakPointerZonesCallbacks(); } void GCRuntime::clearRelocatedArenas(Arena* arenaList, JS::GCReason reason) { diff --git a/js/src/gc/GC.cpp b/js/src/gc/GC.cpp index f64b5de07f94..016a75a61dfc 100644 --- a/js/src/gc/GC.cpp +++ b/js/src/gc/GC.cpp @@ -1295,9 +1295,10 @@ void GCRuntime::removeWeakPointerZonesCallback( EraseCallback(updateWeakPointerZonesCallbacks.ref(), callback); } -void GCRuntime::callWeakPointerZonesCallbacks(JSTracer* trc) const { +void GCRuntime::callWeakPointerZonesCallbacks() const { + JSContext* cx = rt->mainContextFromOwnThread(); for (auto const& p : updateWeakPointerZonesCallbacks.ref()) { - p.op(trc, p.data); + p.op(cx, p.data); } } @@ -1313,9 +1314,10 @@ void GCRuntime::removeWeakPointerCompartmentCallback( } void GCRuntime::callWeakPointerCompartmentCallbacks( - JSTracer* trc, JS::Compartment* comp) const { + JS::Compartment* comp) const { + JSContext* cx = rt->mainContextFromOwnThread(); for (auto const& p : updateWeakPointerCompartmentCallbacks.ref()) { - p.op(trc, comp, p.data); + p.op(cx, comp, p.data); } } diff --git a/js/src/gc/GCRuntime.h b/js/src/gc/GCRuntime.h index c8e96c8f5cec..734e9033bbf9 100644 --- a/js/src/gc/GCRuntime.h +++ b/js/src/gc/GCRuntime.h @@ -893,9 +893,8 @@ class GCRuntime { #endif void callFinalizeCallbacks(JSFreeOp* fop, JSFinalizeStatus status) const; - void callWeakPointerZonesCallbacks(JSTracer* trc) const; - void callWeakPointerCompartmentCallbacks(JSTracer* trc, - JS::Compartment* comp) const; + void callWeakPointerZonesCallbacks() const; + void callWeakPointerCompartmentCallbacks(JS::Compartment* comp) const; void callDoCycleCollectionCallback(JSContext* cx); public: diff --git a/js/src/gc/Marking.cpp b/js/src/gc/Marking.cpp index f90d2782a176..6ed2a6fcf85c 100644 --- a/js/src/gc/Marking.cpp +++ b/js/src/gc/Marking.cpp @@ -2883,9 +2883,8 @@ namespace js { namespace gc { template -JS_PUBLIC_API bool TraceWeakEdge(JSTracer* trc, JS::Heap* thingp) { - return TraceEdgeInternal(trc, gc::ConvertToBase(thingp->unsafeGet()), - "JS::Heap edge"); +JS_PUBLIC_API bool EdgeNeedsSweep(JS::Heap* thingp) { + return IsAboutToBeFinalizedInternal(ConvertToBase(thingp->unsafeGet())); } template @@ -2894,9 +2893,8 @@ JS_PUBLIC_API bool EdgeNeedsSweepUnbarrieredSlow(T* thingp) { } // Instantiate a copy of the Tracing templates for each public GC type. -#define INSTANTIATE_ALL_VALID_HEAP_TRACE_FUNCTIONS(type) \ - template JS_PUBLIC_API bool TraceWeakEdge(JSTracer * trc, \ - JS::Heap*); \ +#define INSTANTIATE_ALL_VALID_HEAP_TRACE_FUNCTIONS(type) \ + template JS_PUBLIC_API bool EdgeNeedsSweep(JS::Heap*); \ template JS_PUBLIC_API bool EdgeNeedsSweepUnbarrieredSlow(type*); JS_FOR_EACH_PUBLIC_GC_POINTER_TYPE(INSTANTIATE_ALL_VALID_HEAP_TRACE_FUNCTIONS) JS_FOR_EACH_PUBLIC_TAGGED_GC_POINTER_TYPE( diff --git a/js/src/gc/Sweeping.cpp b/js/src/gc/Sweeping.cpp index a36b380efe47..a3a6d9c4e2cd 100644 --- a/js/src/gc/Sweeping.cpp +++ b/js/src/gc/Sweeping.cpp @@ -495,6 +495,7 @@ void GCRuntime::freeFromBackgroundThread(AutoLockHelperThreadState& lock) { void GCRuntime::waitBackgroundFreeEnd() { freeTask.join(); } + template IncrementalProgress GCRuntime::markWeakReferences( SliceBudget& incrementalBudget) { @@ -1451,13 +1452,13 @@ void GCRuntime::sweepEmbeddingWeakPointers(JSFreeOp* fop) { callFinalizeCallbacks(fop, JSFINALIZE_GROUP_PREPARE); { AutoPhase ap2(stats(), PhaseKind::WEAK_ZONES_CALLBACK); - callWeakPointerZonesCallbacks(&sweepingTracer); + callWeakPointerZonesCallbacks(); } { AutoPhase ap2(stats(), PhaseKind::WEAK_COMPARTMENT_CALLBACK); for (SweepGroupZonesIter zone(this); !zone.done(); zone.next()) { for (CompartmentsInZoneIter comp(zone); !comp.done(); comp.next()) { - callWeakPointerCompartmentCallbacks(&sweepingTracer, comp); + callWeakPointerCompartmentCallbacks(comp); } } } diff --git a/js/xpconnect/src/XPCJSRuntime.cpp b/js/xpconnect/src/XPCJSRuntime.cpp index ca6773f20b01..23f48fd075f0 100644 --- a/js/xpconnect/src/XPCJSRuntime.cpp +++ b/js/xpconnect/src/XPCJSRuntime.cpp @@ -924,7 +924,7 @@ void XPCJSRuntime::FinalizeCallback(JSFreeOp* fop, JSFinalizeStatus status, } /* static */ -void XPCJSRuntime::WeakPointerZonesCallback(JSTracer* trc, void* data) { +void XPCJSRuntime::WeakPointerZonesCallback(JSContext* cx, void* data) { // Called before each sweeping slice -- after processing any final marking // triggered by barriers -- to clear out any references to things that are // about to be finalized and update any pointers to moved GC things. @@ -938,26 +938,26 @@ void XPCJSRuntime::WeakPointerZonesCallback(JSTracer* trc, void* data) { AutoRestore restoreState(self->mGCIsRunning); self->mGCIsRunning = true; - self->mWrappedJSMap->UpdateWeakPointersAfterGC(trc); - self->mUAWidgetScopeMap.traceWeak(trc); + self->mWrappedJSMap->UpdateWeakPointersAfterGC(); + self->mUAWidgetScopeMap.sweep(); } /* static */ -void XPCJSRuntime::WeakPointerCompartmentCallback(JSTracer* trc, +void XPCJSRuntime::WeakPointerCompartmentCallback(JSContext* cx, JS::Compartment* comp, void* data) { // Called immediately after the ZoneGroup weak pointer callback, but only // once for each compartment that is being swept. CompartmentPrivate* xpcComp = CompartmentPrivate::Get(comp); if (xpcComp) { - xpcComp->UpdateWeakPointersAfterGC(trc); + xpcComp->UpdateWeakPointersAfterGC(); } } -void CompartmentPrivate::UpdateWeakPointersAfterGC(JSTracer* trc) { - mRemoteProxies.traceWeak(trc); - mWrappedJSMap->UpdateWeakPointersAfterGC(trc); - mScope->UpdateWeakPointersAfterGC(trc); +void CompartmentPrivate::UpdateWeakPointersAfterGC() { + mRemoteProxies.sweep(); + mWrappedJSMap->UpdateWeakPointersAfterGC(); + mScope->UpdateWeakPointersAfterGC(); } void XPCJSRuntime::CustomOutOfMemoryCallback() { diff --git a/js/xpconnect/src/XPCMaps.cpp b/js/xpconnect/src/XPCMaps.cpp index 55296843fe4f..7a2fbb0f381f 100644 --- a/js/xpconnect/src/XPCMaps.cpp +++ b/js/xpconnect/src/XPCMaps.cpp @@ -17,7 +17,7 @@ using namespace mozilla; /***************************************************************************/ // implement JSObject2WrappedJSMap... -void JSObject2WrappedJSMap::UpdateWeakPointersAfterGC(JSTracer* trc) { +void JSObject2WrappedJSMap::UpdateWeakPointersAfterGC() { // Check all wrappers and update their JSObject pointer if it has been // moved. Release any wrappers whose weakly held JSObject has died. diff --git a/js/xpconnect/src/XPCMaps.h b/js/xpconnect/src/XPCMaps.h index abdef737e1f5..0cd03b68cd1d 100644 --- a/js/xpconnect/src/XPCMaps.h +++ b/js/xpconnect/src/XPCMaps.h @@ -80,7 +80,7 @@ class JSObject2WrappedJSMap { } } - void UpdateWeakPointersAfterGC(JSTracer* trc); + void UpdateWeakPointersAfterGC(); void ShutdownMarker(); @@ -385,7 +385,7 @@ class JSObject2JSObjectMap { inline uint32_t Count() { return mTable.count(); } - void UpdateWeakPointers(JSTracer* trc) { mTable.traceWeak(trc); } + void Sweep() { mTable.sweep(); } private: Map mTable{XPC_WRAPPER_MAP_LENGTH}; diff --git a/js/xpconnect/src/XPCWrappedNativeScope.cpp b/js/xpconnect/src/XPCWrappedNativeScope.cpp index a6ddfab1c776..61cef1b0f07f 100644 --- a/js/xpconnect/src/XPCWrappedNativeScope.cpp +++ b/js/xpconnect/src/XPCWrappedNativeScope.cpp @@ -267,10 +267,10 @@ void XPCWrappedNativeScope::SuspectAllWrappers( } } -void XPCWrappedNativeScope::UpdateWeakPointersAfterGC(JSTracer* trc) { +void XPCWrappedNativeScope::UpdateWeakPointersAfterGC() { // Sweep waivers. if (mWaiverWrapperMap) { - mWaiverWrapperMap->UpdateWeakPointers(trc); + mWaiverWrapperMap->Sweep(); } if (!js::IsCompartmentZoneSweepingOrCompacting(mCompartment)) { diff --git a/js/xpconnect/src/xpcprivate.h b/js/xpconnect/src/xpcprivate.h index 43c959f4050f..e315c6ef4011 100644 --- a/js/xpconnect/src/xpcprivate.h +++ b/js/xpconnect/src/xpcprivate.h @@ -547,8 +547,8 @@ class XPCJSRuntime final : public mozilla::CycleCollectedJSRuntime { static void DoCycleCollectionCallback(JSContext* cx); static void FinalizeCallback(JSFreeOp* fop, JSFinalizeStatus status, void* data); - static void WeakPointerZonesCallback(JSTracer* trc, void* data); - static void WeakPointerCompartmentCallback(JSTracer* trc, + static void WeakPointerZonesCallback(JSContext* cx, void* data); + static void WeakPointerCompartmentCallback(JSContext* cx, JS::Compartment* comp, void* data); inline void AddVariantRoot(XPCTraceableVariant* variant); @@ -613,10 +613,9 @@ class XPCJSRuntime final : public mozilla::CycleCollectedJSRuntime { }; struct SweepPolicy { - static bool traceWeak(JSTracer* trc, - RefPtr* /* unused */, - JS::Heap* value) { - return JS::GCPolicy>::traceWeak(trc, value); + static bool needsSweep(RefPtr* /* unused */, + JS::Heap* value) { + return JS::GCPolicy>::needsSweep(value); } }; @@ -851,7 +850,7 @@ class XPCWrappedNativeScope final static void SweepAllWrappedNativeTearOffs(); - void UpdateWeakPointersAfterGC(JSTracer* trc); + void UpdateWeakPointersAfterGC(); static void DebugDumpAllScopes(int16_t depth); @@ -2638,16 +2637,16 @@ class CompartmentPrivate { bool wasShutdown; JSObject2WrappedJSMap* GetWrappedJSMap() const { return mWrappedJSMap.get(); } - void UpdateWeakPointersAfterGC(JSTracer* trc); + void UpdateWeakPointersAfterGC(); void SystemIsBeingShutDown(); size_t SizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf); struct SweepPolicy { - static bool traceWeak(JSTracer* trc, const void* /* unused */, - JS::Heap* value) { - return JS::GCPolicy>::traceWeak(trc, value); + static bool needsSweep(const void* /* unused */, + JS::Heap* value) { + return JS::GCPolicy>::needsSweep(value); } };