mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-29 15:52:07 +00:00
Bug 1183604, add some more assertions to help implementing new cycle collectable classes, r=mccr8
--HG-- extra : rebase_source : 2afa00fa6890ec4f2634aa53d361fd837c6161ae
This commit is contained in:
parent
1b1d908d0f
commit
d6c700fd74
@ -322,8 +322,10 @@ private:
|
||||
nsScriptObjectTracer* aTracer);
|
||||
|
||||
#ifdef DEBUG
|
||||
public:
|
||||
void CheckCCWrapperTraversal(void* aScriptObjectHolder,
|
||||
nsScriptObjectTracer* aTracer);
|
||||
private:
|
||||
#endif // DEBUG
|
||||
|
||||
/**
|
||||
|
@ -879,6 +879,52 @@ struct TypeNeedsOuterization
|
||||
IsBaseOf<nsGlobalWindow, T>::value || IsSame<EventTarget, T>::value;
|
||||
};
|
||||
|
||||
#ifdef DEBUG
|
||||
template<typename T, bool isISupports=IsBaseOf<nsISupports, T>::value>
|
||||
struct CheckWrapperCacheTracing
|
||||
{
|
||||
static inline void Check(T* aObject)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
struct CheckWrapperCacheTracing<T, true>
|
||||
{
|
||||
static void Check(T* aObject)
|
||||
{
|
||||
nsWrapperCache* wrapperCacheFromQI = nullptr;
|
||||
aObject->QueryInterface(NS_GET_IID(nsWrapperCache),
|
||||
reinterpret_cast<void**>(&wrapperCacheFromQI));
|
||||
|
||||
MOZ_ASSERT(wrapperCacheFromQI,
|
||||
"Missing nsWrapperCache from QueryInterface implementation?");
|
||||
|
||||
if (!wrapperCacheFromQI->GetWrapperPreserveColor()) {
|
||||
// Can't assert that we trace the wrapper, since we don't have any
|
||||
// wrapper to trace.
|
||||
return;
|
||||
}
|
||||
|
||||
nsISupports* ccISupports = nullptr;
|
||||
aObject->QueryInterface(NS_GET_IID(nsCycleCollectionISupports),
|
||||
reinterpret_cast<void**>(&ccISupports));
|
||||
MOZ_ASSERT(ccISupports,
|
||||
"nsWrapperCache object which isn't cycle collectable?");
|
||||
|
||||
nsXPCOMCycleCollectionParticipant* participant = nullptr;
|
||||
CallQueryInterface(ccISupports, &participant);
|
||||
MOZ_ASSERT(participant, "Can't QI to CycleCollectionParticipant?");
|
||||
|
||||
bool wasPreservingWrapper = wrapperCacheFromQI->PreservingWrapper();
|
||||
wrapperCacheFromQI->SetPreservingWrapper(true);
|
||||
wrapperCacheFromQI->CheckCCWrapperTraversal(ccISupports, participant);
|
||||
wrapperCacheFromQI->SetPreservingWrapper(wasPreservingWrapper);
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
template <class T, GetOrCreateReflectorWrapBehavior wrapBehavior>
|
||||
MOZ_ALWAYS_INLINE bool
|
||||
DoGetOrCreateDOMReflector(JSContext* cx, T* value,
|
||||
@ -903,6 +949,12 @@ DoGetOrCreateDOMReflector(JSContext* cx, T* value,
|
||||
// figure out whether WrapObject() threw.
|
||||
return false;
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
if (IsBaseOf<nsWrapperCache, T>::value) {
|
||||
CheckWrapperCacheTracing<T>::Check(value);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
|
Loading…
Reference in New Issue
Block a user