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 #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;
} }
} }