Bug 1096328 - Remove nativeOwnership from Bindings.conf, templatize deferred finalization. r=bz.

--HG--
extra : rebase_source : 19a8b1beeaa0284c88a2d1b44c3658ece3e620a4
This commit is contained in:
Peter Van der Beken 2014-11-01 14:48:19 +01:00
Родитель 7174c86f2f
Коммит 08e923c587
3 изменённых файлов: 25 добавлений и 38 удалений

Просмотреть файл

@ -2523,22 +2523,6 @@ HasConstructor(JSObject* obj)
}
#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
MustInheritFromNonRefcountedDOMObject(NonRefcountedDOMObject*)
{
@ -2771,11 +2755,26 @@ ToSupportsIsOnPrimaryInheritanceChain(T* aObject, nsWrapperCache* aCache)
aCache);
}
template<class T, template <typename> class SmartPtr,
template<class T,
bool isISupports=IsBaseOf<nsISupports, T>::value>
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*
AppendDeferredFinalizePointer(void* aData, void* aObject)
@ -2784,11 +2783,7 @@ class DeferredFinalizer
if (!pointers) {
pointers = new SmartPtrArray();
}
T* self = static_cast<T*>(aObject);
SmartPtr<T>* defer = pointers->AppendElement();
Take(*defer, self);
AppendAndTake(*pointers, static_cast<T*>(aObject));
return pointers;
}
static bool
@ -2818,8 +2813,8 @@ public:
}
};
template<class T, template <typename> class SmartPtr>
class DeferredFinalizer<T, SmartPtr, true>
template<class T>
class DeferredFinalizer<T, true>
{
public:
static void
@ -2829,11 +2824,11 @@ public:
}
};
template<class T, template <typename> class SmartPtr>
template<class T>
static void
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

Просмотреть файл

@ -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):
finalize = "JSBindingFinalized<%s>::Finalized(self);\n" % descriptor.nativeType
if descriptor.wrapperCache:
@ -1581,8 +1573,8 @@ def finalizeHook(descriptor, hookName, freeOp):
finalize += "self->mExpandoAndGeneration.expando = JS::UndefinedValue();\n"
if descriptor.isGlobal():
finalize += "mozilla::dom::FinalizeGlobal(CastToJSFreeOp(%s), obj);\n" % freeOp
finalize += ("AddForDeferredFinalization<%s, %s >(self);\n" %
(descriptor.nativeType, DeferredFinalizeSmartPtr(descriptor)))
finalize += ("AddForDeferredFinalization<%s>(self);\n" %
descriptor.nativeType)
return CGIfWrapper(CGGeneric(finalize), "self")

Просмотреть файл

@ -81,7 +81,7 @@ ObjectToIdMap::ObjectToIdMap()
ObjectToIdMap::~ObjectToIdMap()
{
if (table_) {
dom::AddForDeferredFinalization<Table, nsAutoPtr>(table_);
dom::AddForDeferredFinalization<Table>(table_);
table_ = nullptr;
}
}