aboutsummaryrefslogtreecommitdiffstats
path: root/libpyside
diff options
context:
space:
mode:
authorLuciano Wolf <luciano.wolf@openbossa.org>2009-12-17 15:44:09 -0300
committerLuciano Wolf <luciano.wolf@openbossa.org>2009-12-17 15:44:09 -0300
commit742d46f23f48018c2fafa036f30e01e6b55a8c2c (patch)
tree9b0a01d412363692cebfb7ffde5ca9da0cd727de /libpyside
parentfb040f76c1752d929f48101a9205223f2d32a98d (diff)
Fix memory corruption caused by tuple processing loop.
Diffstat (limited to 'libpyside')
-rw-r--r--libpyside/signalslotconnection.cpp13
1 files changed, 9 insertions, 4 deletions
diff --git a/libpyside/signalslotconnection.cpp b/libpyside/signalslotconnection.cpp
index f6391682e..125396345 100644
--- a/libpyside/signalslotconnection.cpp
+++ b/libpyside/signalslotconnection.cpp
@@ -60,20 +60,25 @@ SignalSlotConnection::~SignalSlotConnection()
void SignalSlotConnection::trigger(PyObject* args)
{
Q_ASSERT(PySequence_Size(args) >= m_numSlotArgs);
+
const int useSelf = m_receiver ? 1 : 0;
+ int numSlotArgs = m_numSlotArgs;
+
+ if (numSlotArgs == -1)
+ numSlotArgs = PySequence_Size(args) + useSelf;
- PyObject* preparedArgs = PyTuple_New(m_numSlotArgs);
+ PyObject* preparedArgs = PyTuple_New(numSlotArgs);
if (m_receiver)
PyTuple_SetItem(preparedArgs, 0, m_receiver);
- for (int i = 0; i < m_numSlotArgs; ++i)
+ for (int i = 0, max = numSlotArgs - useSelf; i < max; ++i) {
PyTuple_SET_ITEM(preparedArgs, i + useSelf, PyTuple_GET_ITEM(args, i));
+ }
PyObject* retval = PyObject_CallObject(m_function, preparedArgs);
if (retval) {
Py_DECREF(retval);
} else {
- qWarning(qPrintable(QString("Error calling slot ")+
- PyString_AS_STRING(reinterpret_cast<PyCodeObject*>(PyFunction_GET_CODE(m_function))->co_name)));
+ qWarning("Error calling slot");
}
Py_DECREF(preparedArgs);
}