mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-04 14:58:37 +09:00
Consolidate tracing and traversing.
This commit is contained in:
parent
13969c80a3
commit
e015efb999
4 changed files with 38 additions and 16 deletions
|
|
@ -133,7 +133,7 @@ nsWrapperCache::CheckCCWrapperTraversal(void* aScriptObjectHolder,
|
|||
// see through the COM layer, so we use a suppression to help it.
|
||||
JS::AutoSuppressGCAnalysis suppress;
|
||||
|
||||
aTracer->Traverse(aScriptObjectHolder, callback);
|
||||
aTracer->TraverseNativeAndJS(aScriptObjectHolder, callback);
|
||||
MOZ_ASSERT(callback.mFound,
|
||||
"Cycle collection participant didn't traverse to preserved "
|
||||
"wrapper! This will probably crash.");
|
||||
|
|
|
|||
|
|
@ -2265,7 +2265,7 @@ CCGraphBuilder::BuildGraph(SliceBudget& aBudget)
|
|||
SetFirstChild();
|
||||
|
||||
if (pi->mParticipant) {
|
||||
nsresult rv = pi->mParticipant->Traverse(pi->mPointer, *this);
|
||||
nsresult rv = pi->mParticipant->TraverseNativeAndJS(pi->mPointer, *this);
|
||||
MOZ_RELEASE_ASSERT(!NS_FAILED(rv), "Cycle collector Traverse method failed");
|
||||
}
|
||||
|
||||
|
|
@ -2539,7 +2539,7 @@ static bool
|
|||
MayHaveChild(void* aObj, nsCycleCollectionParticipant* aCp)
|
||||
{
|
||||
ChildFinder cf;
|
||||
aCp->Traverse(aObj, cf);
|
||||
aCp->TraverseNativeAndJS(aObj, cf);
|
||||
return cf.MayHaveChild();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -21,8 +21,9 @@ CycleCollectionNoteEdgeNameImpl(nsCycleCollectionTraversalCallback& aCallback,
|
|||
}
|
||||
|
||||
void
|
||||
nsScriptObjectTracer::NoteJSChild(JS::GCCellPtr aGCThing, const char* aName,
|
||||
void* aClosure)
|
||||
nsCycleCollectionParticipant::NoteJSChild(JS::GCCellPtr aGCThing,
|
||||
const char* aName,
|
||||
void* aClosure)
|
||||
{
|
||||
nsCycleCollectionTraversalCallback* cb =
|
||||
static_cast<nsCycleCollectionTraversalCallback*>(aClosure);
|
||||
|
|
|
|||
|
|
@ -113,11 +113,38 @@ private:
|
|||
class NS_NO_VTABLE nsCycleCollectionParticipant
|
||||
{
|
||||
public:
|
||||
constexpr nsCycleCollectionParticipant() : mMightSkip(false) {}
|
||||
constexpr explicit nsCycleCollectionParticipant(bool aSkip) : mMightSkip(aSkip) {}
|
||||
constexpr nsCycleCollectionParticipant()
|
||||
: mMightSkip(false)
|
||||
, mTraverseShouldTrace(false)
|
||||
{
|
||||
}
|
||||
|
||||
constexpr explicit nsCycleCollectionParticipant(bool aSkip,
|
||||
bool aTraverseShouldTrace = false)
|
||||
: mMightSkip(aSkip)
|
||||
, mTraverseShouldTrace(aTraverseShouldTrace)
|
||||
{
|
||||
}
|
||||
|
||||
NS_IMETHOD Traverse(void* aPtr, nsCycleCollectionTraversalCallback& aCb) = 0;
|
||||
|
||||
nsresult TraverseNativeAndJS(void* aPtr,
|
||||
nsCycleCollectionTraversalCallback& aCb)
|
||||
{
|
||||
nsresult rv = Traverse(aPtr, aCb);
|
||||
if (mTraverseShouldTrace) {
|
||||
// Note, we always call Trace, even if Traverse returned
|
||||
// NS_SUCCESS_INTERRUPTED_TRAVERSE.
|
||||
TraceCallbackFunc noteJsChild(&nsCycleCollectionParticipant::NoteJSChild);
|
||||
Trace(aPtr, noteJsChild, &aCb);
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
// Implemented in nsCycleCollectorTraceJSHelpers.cpp.
|
||||
static void NoteJSChild(JS::GCCellPtr aGCThing, const char* aName,
|
||||
void* aClosure);
|
||||
|
||||
NS_IMETHOD_(void) Root(void* aPtr) = 0;
|
||||
NS_IMETHOD_(void) Unlink(void* aPtr) = 0;
|
||||
NS_IMETHOD_(void) Unroot(void* aPtr) = 0;
|
||||
|
|
@ -172,26 +199,24 @@ protected:
|
|||
|
||||
private:
|
||||
const bool mMightSkip;
|
||||
const bool mTraverseShouldTrace;
|
||||
};
|
||||
|
||||
class NS_NO_VTABLE nsScriptObjectTracer : public nsCycleCollectionParticipant
|
||||
{
|
||||
public:
|
||||
constexpr nsScriptObjectTracer()
|
||||
: nsCycleCollectionParticipant(false)
|
||||
: nsCycleCollectionParticipant(false, true)
|
||||
{
|
||||
}
|
||||
constexpr explicit nsScriptObjectTracer(bool aSkip)
|
||||
: nsCycleCollectionParticipant(aSkip)
|
||||
: nsCycleCollectionParticipant(aSkip, true)
|
||||
{
|
||||
}
|
||||
|
||||
NS_IMETHOD_(void) Trace(void* aPtr, const TraceCallbacks& aCb,
|
||||
void* aClosure) override = 0;
|
||||
|
||||
// Implemented in nsCycleCollectorTraceJSHelpers.cpp.
|
||||
static void NoteJSChild(JS::GCCellPtr aGCThing, const char* aName,
|
||||
void* aClosure);
|
||||
};
|
||||
|
||||
class NS_NO_VTABLE nsXPCOMCycleCollectionParticipant : public nsScriptObjectTracer
|
||||
|
|
@ -441,10 +466,6 @@ DowncastCCParticipant(void* aPtr)
|
|||
CycleCollectionNoteChild(cb, tmp->_field, #_field);
|
||||
|
||||
#define NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS \
|
||||
{ \
|
||||
TraceCallbackFunc noteJsChild(&nsScriptObjectTracer::NoteJSChild); \
|
||||
Trace(p, noteJsChild, &cb); \
|
||||
}
|
||||
|
||||
#define NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END \
|
||||
(void)tmp; \
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue