aboutsummaryrefslogtreecommitdiffstats
path: root/libpyside/globalreceiver.cpp
diff options
context:
space:
mode:
authorHugo Lima <hugo.lima@openbossa.org>2009-12-29 17:04:56 -0200
committerHugo Lima <hugo.lima@openbossa.org>2010-01-04 15:48:36 -0200
commit85048bbd6c5d4231f71852cab18fd581c5068141 (patch)
treef1a1b38b04e748c0c50825d51d38c7dafe7ee60e /libpyside/globalreceiver.cpp
parente8e1ecc260028d045efcbc3c71d7a50009950f5b (diff)
Fixes problems calling dynamic python slots.
Reviewed by Marcelo Lira <marcelo.lira@openbossa.org>
Diffstat (limited to 'libpyside/globalreceiver.cpp')
-rw-r--r--libpyside/globalreceiver.cpp39
1 files changed, 29 insertions, 10 deletions
diff --git a/libpyside/globalreceiver.cpp b/libpyside/globalreceiver.cpp
index b058cf537..0d6ce7cf2 100644
--- a/libpyside/globalreceiver.cpp
+++ b/libpyside/globalreceiver.cpp
@@ -41,8 +41,7 @@
using namespace PySide;
-GlobalReceiver::GlobalReceiver()
- : m_metaObject("GlobalReceiver", &QObject::staticMetaObject)
+GlobalReceiver::GlobalReceiver() : m_metaObject("GlobalReceiver", &QObject::staticMetaObject)
{
}
@@ -64,6 +63,16 @@ void GlobalReceiver::addSlot(const char* slot, PyObject* callback)
Py_INCREF(callback);
m_slotReceivers[slotId] = callback;
+ bool isShortCircuit = true;
+ for (int i = 0; slot[i]; ++i) {
+ if (slot[i] == '(') {
+ isShortCircuit = false;
+ break;
+ }
+ }
+ if (isShortCircuit)
+ m_shortCircuitSlots << slotId;
+
Q_ASSERT(slotId >= QObject::staticMetaObject.methodCount());
}
@@ -79,22 +88,32 @@ int GlobalReceiver::qt_metacall(QMetaObject::Call call, int id, void** args)
Q_ASSERT(id >= QObject::staticMetaObject.methodCount());
QMetaMethod slot = m_metaObject.method(id);
Q_ASSERT(slot.methodType() == QMetaMethod::Slot);
- QList<QByteArray> paramTypes = slot.parameterTypes();
PyObject* callback = m_slotReceivers.value(id);
if (!callback) {
- qWarning("Unknown global slot.");
+ qWarning() << "Unknown global slot, id:" << id;
return -1;
}
- Shiboken::AutoDecRef preparedArgs(PyTuple_New(paramTypes.count()));
- for (int i = 0, max = paramTypes.count(); i < max; ++i) {
- PyObject* arg = TypeResolver::get(paramTypes[i].constData())->toPython(args[i+1]);
- PyTuple_SET_ITEM(preparedArgs.object(), i, arg);
+ int numArgs;
+ PyObject* retval = 0;
+ if (m_shortCircuitSlots.contains(id)) {
+ retval = PyObject_CallObject(callback, reinterpret_cast<PyObject*>(args[1]));
+ } else {
+ QList<QByteArray> paramTypes = slot.parameterTypes();
+ numArgs = paramTypes.count();
+ Shiboken::AutoDecRef preparedArgs(PyTuple_New(paramTypes.count()));
+ for (int i = 0, max = paramTypes.count(); i < max; ++i) {
+ PyObject* arg = TypeResolver::get(paramTypes[i].constData())->toPython(args[i+1]);
+ PyTuple_SET_ITEM(preparedArgs.object(), i, arg);
+ }
+
+ retval = PyObject_CallObject(callback, preparedArgs);
}
- Shiboken::AutoDecRef retval(PyObject_CallObject(callback, preparedArgs));
if (!retval)
- qWarning("Error calling slot");
+ qWarning() << "Error calling slot" << m_metaObject.method(id).signature();
+ else
+ Py_DECREF(retval);
return -1;
}