aboutsummaryrefslogtreecommitdiffstats
path: root/libpyside/dynamicqmetaobject.cpp
diff options
context:
space:
mode:
authorRenato Filho <renato.filho@openbossa.org>2010-02-19 17:10:24 -0300
committerRenato Filho <renato.filho@openbossa.org>2010-02-23 16:35:40 -0300
commit75b7afbd63be9b27d3bd964891720e8c16079280 (patch)
treef56e9d83a73bff0119333649521663f5c45aad20 /libpyside/dynamicqmetaobject.cpp
parentab738e07d2cffc0fc9692ecc3a5f830847b853bb (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/dynamicqmetaobject.cpp')
-rw-r--r--libpyside/dynamicqmetaobject.cpp35
1 files changed, 30 insertions, 5 deletions
diff --git a/libpyside/dynamicqmetaobject.cpp b/libpyside/dynamicqmetaobject.cpp
index 192b9bcc8..dbc51803c 100644
--- a/libpyside/dynamicqmetaobject.cpp
+++ b/libpyside/dynamicqmetaobject.cpp
@@ -58,6 +58,13 @@ static int registerString(const QByteArray& s, QList<QByteArray>* strings)
return idx;
}
+static void clearItem(QLinkedList<QByteArray> &l, const QByteArray &value)
+{
+ QLinkedList<QByteArray>::iterator i = qFind(l.begin(), l.end(), value);
+ if (i != l.end())
+ *i = QByteArray();
+}
+
DynamicQMetaObject::DynamicQMetaObject(const char *className, const QMetaObject* metaObject)
{
d.superdata = metaObject;
@@ -76,6 +83,15 @@ DynamicQMetaObject::~DynamicQMetaObject()
void DynamicQMetaObject::addSignal(const char* signal)
{
+ //search for a empty space
+ QByteArray blank;
+ QLinkedList<QByteArray>::iterator i = qFind(m_signals.begin(), m_signals.end(), blank);
+ if (i != m_signals.end()) {
+ *i = QByteArray(signal);
+ updateMetaObject();
+ return;
+ }
+
if (m_signals.size() >= MAX_SIGNALS_COUNT) {
qWarning() << "Fail to add dynamic signal to QObject. PySide support at most" << MAX_SIGNALS_COUNT << "dynamic signals.";
return;
@@ -87,25 +103,34 @@ void DynamicQMetaObject::addSignal(const char* signal)
void DynamicQMetaObject::addSlot(const char* slot)
{
- m_slots << QByteArray(slot);
+ //search for a empty space
+ QByteArray blank;
+ QLinkedList<QByteArray>::iterator i = qFind(m_slots.begin(), m_slots.end(), blank);
+ if (i != m_slots.end()) {
+ *i = QByteArray(slot);
+ } else {
+ m_slots << QByteArray(slot);
+ }
updateMetaObject();
}
void DynamicQMetaObject::removeSlot(uint index)
{
QMetaMethod m = method(index);
- if (m_slots.removeAll(m.signature()))
+ if (m_slots.contains(m.signature())) {
+ clearItem(m_slots, m.signature());
updateMetaObject();
+ }
}
void DynamicQMetaObject::removeSignal(uint index)
{
//Current Qt implementation does not support runtime remove signal
- /*
QMetaMethod m = method(index);
- if (m_signals.removeAll(m.signature()))
+ if (m_signals.contains(m.signature())) {
+ clearItem(m_signals, m.signature());
updateMetaObject();
- */
+ }
}
void DynamicQMetaObject::updateMetaObject()