зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1096328 - Remove nativeOwnership from Bindings.conf, templatize deferred finalization. r=bz.
--HG-- extra : rebase_source : 19a8b1beeaa0284c88a2d1b44c3658ece3e620a4
This commit is contained in:
Родитель
7174c86f2f
Коммит
08e923c587
|
@ -2523,22 +2523,6 @@ HasConstructor(JSObject* obj)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Transfer reference in ptr to smartPtr.
|
|
||||||
template<class T>
|
|
||||||
inline void
|
|
||||||
Take(nsRefPtr<T>& smartPtr, T* ptr)
|
|
||||||
{
|
|
||||||
smartPtr = dont_AddRef(ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Transfer ownership of ptr to smartPtr.
|
|
||||||
template<class T>
|
|
||||||
inline void
|
|
||||||
Take(nsAutoPtr<T>& smartPtr, T* ptr)
|
|
||||||
{
|
|
||||||
smartPtr = ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void
|
inline void
|
||||||
MustInheritFromNonRefcountedDOMObject(NonRefcountedDOMObject*)
|
MustInheritFromNonRefcountedDOMObject(NonRefcountedDOMObject*)
|
||||||
{
|
{
|
||||||
|
@ -2771,11 +2755,26 @@ ToSupportsIsOnPrimaryInheritanceChain(T* aObject, nsWrapperCache* aCache)
|
||||||
aCache);
|
aCache);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class T, template <typename> class SmartPtr,
|
template<class T,
|
||||||
bool isISupports=IsBaseOf<nsISupports, T>::value>
|
bool isISupports=IsBaseOf<nsISupports, T>::value>
|
||||||
class DeferredFinalizer
|
class DeferredFinalizer
|
||||||
{
|
{
|
||||||
typedef nsTArray<SmartPtr<T> > SmartPtrArray;
|
typedef typename Conditional<IsRefcounted<T>::value,
|
||||||
|
nsRefPtr<T>, nsAutoPtr<T>>::Type SmartPtr;
|
||||||
|
typedef nsTArray<SmartPtr> SmartPtrArray;
|
||||||
|
|
||||||
|
template<class U>
|
||||||
|
static inline void
|
||||||
|
AppendAndTake(nsTArray<nsRefPtr<U>>& smartPtrArray, U* ptr)
|
||||||
|
{
|
||||||
|
smartPtrArray.AppendElement(dont_AddRef(ptr));
|
||||||
|
}
|
||||||
|
template<class U>
|
||||||
|
static inline void
|
||||||
|
AppendAndTake(nsTArray<nsAutoPtr<U>>& smartPtrArray, U* ptr)
|
||||||
|
{
|
||||||
|
smartPtrArray.AppendElement(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
static void*
|
static void*
|
||||||
AppendDeferredFinalizePointer(void* aData, void* aObject)
|
AppendDeferredFinalizePointer(void* aData, void* aObject)
|
||||||
|
@ -2784,11 +2783,7 @@ class DeferredFinalizer
|
||||||
if (!pointers) {
|
if (!pointers) {
|
||||||
pointers = new SmartPtrArray();
|
pointers = new SmartPtrArray();
|
||||||
}
|
}
|
||||||
|
AppendAndTake(*pointers, static_cast<T*>(aObject));
|
||||||
T* self = static_cast<T*>(aObject);
|
|
||||||
|
|
||||||
SmartPtr<T>* defer = pointers->AppendElement();
|
|
||||||
Take(*defer, self);
|
|
||||||
return pointers;
|
return pointers;
|
||||||
}
|
}
|
||||||
static bool
|
static bool
|
||||||
|
@ -2818,8 +2813,8 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class T, template <typename> class SmartPtr>
|
template<class T>
|
||||||
class DeferredFinalizer<T, SmartPtr, true>
|
class DeferredFinalizer<T, true>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static void
|
static void
|
||||||
|
@ -2829,11 +2824,11 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class T, template <typename> class SmartPtr>
|
template<class T>
|
||||||
static void
|
static void
|
||||||
AddForDeferredFinalization(T* aObject)
|
AddForDeferredFinalization(T* aObject)
|
||||||
{
|
{
|
||||||
DeferredFinalizer<T, SmartPtr>::AddForDeferredFinalization(aObject);
|
DeferredFinalizer<T>::AddForDeferredFinalization(aObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
// This returns T's CC participant if it participates in CC or null if it
|
// This returns T's CC participant if it participates in CC or null if it
|
||||||
|
|
|
@ -1565,14 +1565,6 @@ class CGAddPropertyHook(CGAbstractClassHook):
|
||||||
""")
|
""")
|
||||||
|
|
||||||
|
|
||||||
def DeferredFinalizeSmartPtr(descriptor):
|
|
||||||
if descriptor.nativeOwnership == 'owned':
|
|
||||||
smartPtr = 'nsAutoPtr'
|
|
||||||
else:
|
|
||||||
smartPtr = 'nsRefPtr'
|
|
||||||
return smartPtr
|
|
||||||
|
|
||||||
|
|
||||||
def finalizeHook(descriptor, hookName, freeOp):
|
def finalizeHook(descriptor, hookName, freeOp):
|
||||||
finalize = "JSBindingFinalized<%s>::Finalized(self);\n" % descriptor.nativeType
|
finalize = "JSBindingFinalized<%s>::Finalized(self);\n" % descriptor.nativeType
|
||||||
if descriptor.wrapperCache:
|
if descriptor.wrapperCache:
|
||||||
|
@ -1581,8 +1573,8 @@ def finalizeHook(descriptor, hookName, freeOp):
|
||||||
finalize += "self->mExpandoAndGeneration.expando = JS::UndefinedValue();\n"
|
finalize += "self->mExpandoAndGeneration.expando = JS::UndefinedValue();\n"
|
||||||
if descriptor.isGlobal():
|
if descriptor.isGlobal():
|
||||||
finalize += "mozilla::dom::FinalizeGlobal(CastToJSFreeOp(%s), obj);\n" % freeOp
|
finalize += "mozilla::dom::FinalizeGlobal(CastToJSFreeOp(%s), obj);\n" % freeOp
|
||||||
finalize += ("AddForDeferredFinalization<%s, %s >(self);\n" %
|
finalize += ("AddForDeferredFinalization<%s>(self);\n" %
|
||||||
(descriptor.nativeType, DeferredFinalizeSmartPtr(descriptor)))
|
descriptor.nativeType)
|
||||||
return CGIfWrapper(CGGeneric(finalize), "self")
|
return CGIfWrapper(CGGeneric(finalize), "self")
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -81,7 +81,7 @@ ObjectToIdMap::ObjectToIdMap()
|
||||||
ObjectToIdMap::~ObjectToIdMap()
|
ObjectToIdMap::~ObjectToIdMap()
|
||||||
{
|
{
|
||||||
if (table_) {
|
if (table_) {
|
||||||
dom::AddForDeferredFinalization<Table, nsAutoPtr>(table_);
|
dom::AddForDeferredFinalization<Table>(table_);
|
||||||
table_ = nullptr;
|
table_ = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче