Issue #2678 - Avoid QIing for NoteXPCOMRoot.

This callback is only used in very limited ways, so just require that the
caller passes in the canonical supports pointer plus the participant.

This probably won't affect performance much.
This commit is contained in:
Moonchild 2025-01-16 23:11:37 +01:00 committed by roytam1
commit 38daeffb9b
3 changed files with 13 additions and 9 deletions

View file

@ -629,11 +629,12 @@ XPCJSContext::TraverseAdditionalNativeRoots(nsCycleCollectionNoteRootCallback& c
if (val.isObject() && !JS::ObjectIsMarkedGray(&val.toObject()))
continue;
}
cb.NoteXPCOMRoot(v);
cb.NoteXPCOMRoot(v, XPCTraceableVariant::NS_CYCLE_COLLECTION_INNERCLASS::GetParticipant());
}
for (XPCRootSetElem* e = mWrappedJSRoots; e ; e = e->GetNextRoot()) {
cb.NoteXPCOMRoot(ToSupports(static_cast<nsXPCWrappedJS*>(e)));
cb.NoteXPCOMRoot(ToSupports(static_cast<nsXPCWrappedJS*>(e)),
nsXPCWrappedJS::NS_CYCLE_COLLECTION_INNERCLASS::GetParticipant());
}
}

View file

@ -2088,7 +2088,7 @@ private:
public:
// nsCycleCollectionNoteRootCallback methods.
NS_IMETHOD_(void) NoteXPCOMRoot(nsISupports* aRoot);
NS_IMETHOD_(void) NoteXPCOMRoot(nsISupports* aRoot, nsCycleCollectionParticipant* aParticipant);
NS_IMETHOD_(void) NoteJSRoot(JSObject* aRoot);
NS_IMETHOD_(void) NoteNativeRoot(void* aRoot,
nsCycleCollectionParticipant* aParticipant);
@ -2281,16 +2281,17 @@ CCGraphBuilder::BuildGraph(SliceBudget& aBudget)
}
NS_IMETHODIMP_(void)
CCGraphBuilder::NoteXPCOMRoot(nsISupports* aRoot)
CCGraphBuilder::NoteXPCOMRoot(nsISupports* aRoot, nsCycleCollectionParticipant* aParticipant)
{
aRoot = CanonicalizeXPCOMParticipant(aRoot);
NS_ASSERTION(aRoot,
"Don't add objects that don't participate in collection!");
MOZ_ASSERT(aRoot == CanonicalizeXPCOMParticipant(aRoot));
#ifdef DEBUG
nsXPCOMCycleCollectionParticipant* cp;
ToParticipant(aRoot, &cp);
MOZ_ASSERT(aParticipant == cp);
#endif
NoteRoot(aRoot, cp);
NoteRoot(aRoot, aParticipant);
}
NS_IMETHODIMP_(void)

View file

@ -12,7 +12,9 @@ class nsISupports;
class nsCycleCollectionNoteRootCallback
{
public:
NS_IMETHOD_(void) NoteXPCOMRoot(nsISupports* aRoot) = 0;
// aRoot must be canonical (ie the result of QIing to nsCycleCollectionISupports).
NS_IMETHOD_(void) NoteXPCOMRoot(nsISupports* aRoot,
nsCycleCollectionParticipant* aParticipant) = 0;
NS_IMETHOD_(void) NoteJSRoot(JSObject* aRoot) = 0;
NS_IMETHOD_(void) NoteNativeRoot(void* aRoot,
nsCycleCollectionParticipant* aParticipant) = 0;