diff options
Diffstat (limited to 'src/corelib/kernel/qobject.cpp')
-rw-r--r-- | src/corelib/kernel/qobject.cpp | 32 |
1 files changed, 14 insertions, 18 deletions
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index a00d528ec9..6ac29879b9 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -72,6 +72,11 @@ QT_BEGIN_NAMESPACE static int DIRECT_CONNECTION_ONLY = 0; +struct QSlotObjectBaseDeleter { // for use with QScopedPointer<QSlotObjectBase,...> + static void cleanup(QtPrivate::QSlotObjectBase *slot) { + if (slot && !slot->ref.deref() ) slot->destroy(); + } +}; static int *queuedConnectionTypes(const QList<QByteArray> &typeNames) { int *types = new int [typeNames.count() + 1]; @@ -432,7 +437,7 @@ QMetaCallEvent::QMetaCallEvent(ushort method_offset, ushort method_relative, QOb /*! \internal */ -QMetaCallEvent::QMetaCallEvent(QObject::QSlotObjectBase *slotO, const QObject *sender, int signalId, +QMetaCallEvent::QMetaCallEvent(QtPrivate::QSlotObjectBase *slotO, const QObject *sender, int signalId, int nargs, int *types, void **args, QSemaphore *semaphore) : QEvent(MetaCall), slotObj_(slotO), sender_(sender), signalId_(signalId), nargs_(nargs), types_(types), args_(args), semaphore_(semaphore), @@ -460,7 +465,7 @@ QMetaCallEvent::~QMetaCallEvent() semaphore_->release(); #endif if (slotObj_ && !slotObj_->ref.deref()) - delete slotObj_; + slotObj_->destroy(); } /*! @@ -864,7 +869,7 @@ QObjectPrivate::Connection::~Connection() delete [] v; } if (isSlotObject && !slotObj->ref.deref()) - delete slotObj; + slotObj->destroy(); } @@ -3412,7 +3417,8 @@ void QMetaObject::activate(QObject *sender, int signalOffset, int local_signal_i const QObjectPrivate::StaticMetaCallFunction callFunction = c->callFunction; const int method_relative = c->method_relative; if (c->isSlotObject) { - QExplicitlySharedDataPointer<QObject::QSlotObjectBase> obj(c->slotObj); + c->slotObj->ref.ref(); + const QScopedPointer<QtPrivate::QSlotObjectBase, QSlotObjectBaseDeleter> obj(c->slotObj); locker.unlock(); obj->call(receiver, argv ? argv : empty_argv); locker.relock(); @@ -4185,13 +4191,13 @@ void qDeleteInEventHandler(QObject *o) */ QMetaObject::Connection QObject::connectImpl(const QObject *sender, void **signal, const QObject *receiver, void **slot, - QObject::QSlotObjectBase *slotObj, Qt::ConnectionType type, + QtPrivate::QSlotObjectBase *slotObj, Qt::ConnectionType type, const int *types, const QMetaObject *senderMetaObject) { if (!sender || !signal || !slotObj || !senderMetaObject) { qWarning("QObject::connect: invalid null parametter"); if (slotObj && !slotObj->ref.deref()) - delete slotObj; + slotObj->destroy(); return QMetaObject::Connection(); } int signal_index = -1; @@ -4200,7 +4206,7 @@ QMetaObject::Connection QObject::connectImpl(const QObject *sender, void **signa if (signal_index < 0 || signal_index >= QMetaObjectPrivate::get(senderMetaObject)->signalCount) { qWarning("QObject::connect: signal not found in %s", senderMetaObject->className()); if (!slotObj->ref.deref()) - delete slotObj; + slotObj->destroy(); return QMetaObject::Connection(0); } signal_index += QMetaObjectPrivate::signalOffset(senderMetaObject); @@ -4220,7 +4226,7 @@ QMetaObject::Connection QObject::connectImpl(const QObject *sender, void **signa while (c2) { if (c2->receiver == receiver && c2->isSlotObject && c2->slotObj->compare(slot)) { if (!slotObj->ref.deref()) - delete slotObj; + slotObj->destroy(); return QMetaObject::Connection(); } c2 = c2->nextConnectionList; @@ -4412,16 +4418,6 @@ QMetaObject::Connection::~Connection() the signal or the slot, or if the arguments do not match. */ -QObject::QSlotObjectBase::~QSlotObjectBase() -{ -} - -bool QObject::QSlotObjectBase::compare(void** ) -{ - return false; -} - - QT_END_NAMESPACE #include "moc_qobject.cpp" |