summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qobject.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/kernel/qobject.cpp')
-rw-r--r--src/corelib/kernel/qobject.cpp32
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"