diff options
author | Olivier Goffart <ogoffart@woboq.com> | 2014-08-08 13:53:14 +0200 |
---|---|---|
committer | Olivier Goffart <ogoffart@woboq.com> | 2014-08-09 08:31:20 +0200 |
commit | 3750c677ee4cac5525f9c7be3978173037dd089d (patch) | |
tree | f606cf7dc5b5448eac3c63c84d114373de3e1705 /src/corelib/kernel/qobject.cpp | |
parent | 6f1299c0b44c969137d28da346fc6539aac20f3b (diff) |
QObject: fix valgrind warning when disconnecting
QObjectPrivate::Connection::method should never be called when
the Connection was made with the function pointer syntax
This caused valgrind warning about using uninitialized value on such code:
QObject::connect(&o, &Object::aSignal, &o, &Object::aSlot);
o.disconnect(&o, SLOT(aSlot()));
Change-Id: Iaff9ecd3ddfe665db92726b420021493453c4cea
Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/kernel/qobject.cpp')
-rw-r--r-- | src/corelib/kernel/qobject.cpp | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index fb01df3099..db2b086ff2 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -3309,7 +3309,7 @@ bool QMetaObjectPrivate::disconnectHelper(QObjectPrivate::Connection *c, while (c) { if (c->receiver && (receiver == 0 || (c->receiver == receiver - && (method_index < 0 || c->method() == method_index) + && (method_index < 0 || (!c->isSlotObject && c->method() == method_index)) && (slot == 0 || (c->isSlotObject && c->slotObj->compare(slot)))))) { bool needToUnlock = false; QMutex *receiverMutex = 0; @@ -3999,6 +3999,11 @@ void QObject::dumpObjectInfo() c = c->nextConnectionList; continue; } + if (c->isSlotObject) { + qDebug(" <functor or function pointer>"); + c = c->nextConnectionList; + continue; + } const QMetaObject *receiverMetaObject = c->receiver->metaObject(); const QMetaMethod method = receiverMetaObject->method(c->method()); qDebug(" --> %s::%s %s", @@ -4017,11 +4022,15 @@ void QObject::dumpObjectInfo() if (d->senders) { for (QObjectPrivate::Connection *s = d->senders; s; s = s->next) { - const QMetaMethod slot = metaObject()->method(s->method()); - qDebug(" <-- %s::%s %s", + QByteArray slotName = QByteArrayLiteral("<unknown>"); + if (!s->isSlotObject) { + const QMetaMethod slot = metaObject()->method(s->method()); + slotName = slot.methodSignature(); + } + qDebug(" <-- %s::%s %s", s->sender->metaObject()->className(), s->sender->objectName().isEmpty() ? "unnamed" : qPrintable(s->sender->objectName()), - slot.methodSignature().constData()); + slotName.constData()); } } else { qDebug(" <None>"); |