diff options
author | Renato Filho <renato.filho@openbossa.org> | 2010-02-19 17:10:24 -0300 |
---|---|---|
committer | Renato Filho <renato.filho@openbossa.org> | 2010-02-23 16:35:40 -0300 |
commit | 75b7afbd63be9b27d3bd964891720e8c16079280 (patch) | |
tree | f56e9d83a73bff0119333649521663f5c45aad20 /libpyside/signalmanager.cpp | |
parent | ab738e07d2cffc0fc9692ecc3a5f830847b853bb (diff) |
Fixed memory leak on callbacks used on signal connection.
Now using the 'destroyed()' signal the reference is cleaned after source
object destroyed.
Diffstat (limited to 'libpyside/signalmanager.cpp')
-rw-r--r-- | libpyside/signalmanager.cpp | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/libpyside/signalmanager.cpp b/libpyside/signalmanager.cpp index 7a3236fd1..9d648611d 100644 --- a/libpyside/signalmanager.cpp +++ b/libpyside/signalmanager.cpp @@ -69,7 +69,12 @@ bool PySide::checkSignal(const char* signal) static QString codeCallbackName(PyObject* callback, const QString& funcName) { - return funcName+QString::number(quint64(callback), 16); + if (PyMethod_Check(callback)) { + PyObject *self = PyMethod_GET_SELF(callback); + PyObject *func = PyMethod_GET_FUNCTION(callback); + return funcName + QString::number(quint64(self), 16) + QString::number(quint64(func), 16); + } else + return funcName+QString::number(quint64(callback), 16); } QString PySide::getCallbackSignature(const char* signal, PyObject* callback, bool encodeName) @@ -185,14 +190,14 @@ QObject* SignalManager::globalReceiver() return &m_d->m_globalReceiver; } -void SignalManager::globalReceiverConnectNotify(int slotIndex) +void SignalManager::globalReceiverConnectNotify(QObject* source, int slotIndex) { - m_d->m_globalReceiver.connectNotify(slotIndex); + m_d->m_globalReceiver.connectNotify(source, slotIndex); } -void SignalManager::globalReceiverDisconnectNotify(int slotIndex) +void SignalManager::globalReceiverDisconnectNotify(QObject* source, int slotIndex) { - m_d->m_globalReceiver.disconnectNotify(slotIndex); + m_d->m_globalReceiver.disconnectNotify(source, slotIndex); } void SignalManager::addGlobalSlot(const char* slot, PyObject* callback) @@ -234,7 +239,6 @@ bool SignalManager::emitSignal(QObject* source, const char* signal, PyObject* ar return false; signal++; - int signalIndex = source->metaObject()->indexOfSignal(signal); if (signalIndex != -1) { bool isShortCircuit; @@ -311,3 +315,8 @@ bool SignalManager::registerMetaMethod(QObject* source, const char* signature, Q } return true; } + +bool SignalManager::hasConnectionWith(const QObject *object) +{ + return m_d->m_globalReceiver.hasConnectionWith(object); +} |