Loading content/base/src/nsXMLHttpRequest.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -529,7 +529,8 @@ NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_BEGIN(nsXMLHttpRequest) NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_END NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_BEGIN(nsXMLHttpRequest) return tmp->IsBlack(); return tmp-> IsBlackAndDoesNotNeedTracing(static_cast<nsDOMEventTargetHelper*>(tmp)); NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_END NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_BEGIN(nsXMLHttpRequest) Loading content/events/src/nsDOMEventTargetHelper.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -53,7 +53,7 @@ NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_BEGIN(nsDOMEventTargetHelper) NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_END NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_BEGIN(nsDOMEventTargetHelper) return tmp->IsBlack(); return tmp->IsBlackAndDoesNotNeedTracing(tmp); NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_END NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_BEGIN(nsDOMEventTargetHelper) Loading dom/base/nsWrapperCache.h +6 −0 Original line number Diff line number Diff line Loading @@ -159,6 +159,12 @@ public: */ bool IsBlack(); /** * Returns true if the object has a black wrapper, * and all the GC things it is keeping alive are black too. */ bool IsBlackAndDoesNotNeedTracing(nsISupports* aThis); // Only meant to be called by code that preserves a wrapper. void SetPreservingWrapper(bool aPreserve) { Loading dom/base/nsWrapperCacheInlines.h +22 −0 Original line number Diff line number Diff line Loading @@ -24,4 +24,26 @@ nsWrapperCache::IsBlack() return o && !xpc_IsGrayGCThing(o); } static void SearchGray(void* aGCThing, const char* aName, void* aClosure) { bool* hasGrayObjects = static_cast<bool*>(aClosure); if (!*hasGrayObjects && aGCThing && xpc_IsGrayGCThing(aGCThing)) { *hasGrayObjects = true; } } inline bool nsWrapperCache::IsBlackAndDoesNotNeedTracing(nsISupports* aThis) { if (IsBlack()) { nsXPCOMCycleCollectionParticipant* participant = nullptr; CallQueryInterface(aThis, &participant); bool hasGrayObjects = false; participant->Trace(aThis, SearchGray, &hasGrayObjects); return !hasGrayObjects; } return false; } #endif /* nsWrapperCache_h___ */ Loading
content/base/src/nsXMLHttpRequest.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -529,7 +529,8 @@ NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_BEGIN(nsXMLHttpRequest) NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_END NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_BEGIN(nsXMLHttpRequest) return tmp->IsBlack(); return tmp-> IsBlackAndDoesNotNeedTracing(static_cast<nsDOMEventTargetHelper*>(tmp)); NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_END NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_BEGIN(nsXMLHttpRequest) Loading
content/events/src/nsDOMEventTargetHelper.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -53,7 +53,7 @@ NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_BEGIN(nsDOMEventTargetHelper) NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_END NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_BEGIN(nsDOMEventTargetHelper) return tmp->IsBlack(); return tmp->IsBlackAndDoesNotNeedTracing(tmp); NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_END NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_BEGIN(nsDOMEventTargetHelper) Loading
dom/base/nsWrapperCache.h +6 −0 Original line number Diff line number Diff line Loading @@ -159,6 +159,12 @@ public: */ bool IsBlack(); /** * Returns true if the object has a black wrapper, * and all the GC things it is keeping alive are black too. */ bool IsBlackAndDoesNotNeedTracing(nsISupports* aThis); // Only meant to be called by code that preserves a wrapper. void SetPreservingWrapper(bool aPreserve) { Loading
dom/base/nsWrapperCacheInlines.h +22 −0 Original line number Diff line number Diff line Loading @@ -24,4 +24,26 @@ nsWrapperCache::IsBlack() return o && !xpc_IsGrayGCThing(o); } static void SearchGray(void* aGCThing, const char* aName, void* aClosure) { bool* hasGrayObjects = static_cast<bool*>(aClosure); if (!*hasGrayObjects && aGCThing && xpc_IsGrayGCThing(aGCThing)) { *hasGrayObjects = true; } } inline bool nsWrapperCache::IsBlackAndDoesNotNeedTracing(nsISupports* aThis) { if (IsBlack()) { nsXPCOMCycleCollectionParticipant* participant = nullptr; CallQueryInterface(aThis, &participant); bool hasGrayObjects = false; participant->Trace(aThis, SearchGray, &hasGrayObjects); return !hasGrayObjects; } return false; } #endif /* nsWrapperCache_h___ */