aboutsummaryrefslogtreecommitdiffstats
path: root/libpyside/signalmanager.cpp
diff options
context:
space:
mode:
authorHugo Parente Lima <hugo.pl@gmail.com>2011-10-26 20:17:56 -0200
committerHugo Parente Lima <hugo.pl@gmail.com>2012-03-08 16:56:15 -0300
commit67d6455fa52921d631001e7938aa7b9fa40b45aa (patch)
tree11e72784d6dea502c8df4089f20bceea666c3ff4 /libpyside/signalmanager.cpp
parent15ceed791f8dda4aa1256e67c11f8a748ce4b7b0 (diff)
Unify the code used to do QObject meta calls.
Diffstat (limited to 'libpyside/signalmanager.cpp')
-rw-r--r--libpyside/signalmanager.cpp57
1 files changed, 7 insertions, 50 deletions
diff --git a/libpyside/signalmanager.cpp b/libpyside/signalmanager.cpp
index 8e5f2e613..a95f5f130 100644
--- a/libpyside/signalmanager.cpp
+++ b/libpyside/signalmanager.cpp
@@ -26,6 +26,7 @@
#include "pysideproperty_p.h"
#include "pyside.h"
#include "dynamicqmetaobject.h"
+#include "pysidemetafunction_p.h"
#include <QHash>
#include <QStringList>
@@ -34,6 +35,7 @@
#include <gilstate.h>
#include <QDebug>
#include <limits>
+#include <algorithm>
#include <typeresolver.h>
#include <basewrapper.h>
#include <conversions.h>
@@ -54,7 +56,6 @@ namespace {
static int callMethod(QObject* object, int id, void** args);
static PyObject* parseArguments(QList<QByteArray> paramTypese, void** args);
static bool emitShortCircuitSignal(QObject* source, int signalIndex, PyObject* args);
- static bool emitNormalSignal(QObject* source, int signalIndex, const char* signal, PyObject* args, const QStringList& argTypes);
#ifdef IS_PY3K
static void destroyMetaObject(PyObject* obj)
@@ -338,13 +339,14 @@ bool SignalManager::emitSignal(QObject* source, const char* signal, PyObject* ar
int signalIndex = source->metaObject()->indexOfSignal(signal);
if (signalIndex != -1) {
- bool isShortCircuit;
- QStringList argTypes = Signal::getArgsFromSignature(signal, &isShortCircuit);
-
+ // cryptic but works!
+ // if the signature doesn't have a '(' it's a shor circuited signal, i.e. std::find
+ // returned the string null terminator.
+ bool isShortCircuit = !*std::find(signal, signal + std::strlen(signal), '(');
if (isShortCircuit)
return emitShortCircuitSignal(source, signalIndex, args);
else
- return emitNormalSignal(source, signalIndex, signal, args, argTypes);
+ return MetaFunction::call(source, signalIndex, args);
}
return false;
}
@@ -572,49 +574,4 @@ static bool emitShortCircuitSignal(QObject* source, int signalIndex, PyObject* a
return true;
}
-static bool emitNormalSignal(QObject* source, int signalIndex, const char* signal, PyObject* args, const QStringList& argTypes)
-{
- Shiboken::AutoDecRef sequence(PySequence_Fast(args, 0));
- int argsGiven = PySequence_Fast_GET_SIZE(sequence.object());
-
- if (argsGiven != argTypes.count()) {
- PyErr_Format(PyExc_TypeError, "%s only accepts %d arguments, %d given!", signal, argTypes.count(), argsGiven);
- return false;
- }
-
- QVariant* signalValues = new QVariant[argsGiven];
- void** signalArgs = new void*[argsGiven + 1];
- signalArgs[0] = 0;
-
- int i;
- for (i = 0; i < argsGiven; ++i) {
- QByteArray typeName = argTypes[i].toAscii();
- Shiboken::TypeResolver* typeResolver = Shiboken::TypeResolver::get(typeName);
- if (typeResolver) {
- if (Shiboken::TypeResolver::getType(typeName) == Shiboken::TypeResolver::ValueType) {
- int typeId = QMetaType::type(typeName);
- if (!typeId) {
- PyErr_Format(PyExc_TypeError, "Value type used on signal needs to be registered on meta type: %s", typeName.data());
- break;
- }
- signalValues[i] = QVariant(typeId, (void*) 0);
- }
- signalArgs[i+1] = signalValues[i].data();
- typeResolver->toCpp(PySequence_Fast_GET_ITEM(sequence.object(), i), &signalArgs[i+1]);
- } else {
- PyErr_Format(PyExc_TypeError, "Unknown type used to emit a signal: %s", qPrintable(argTypes[i]));
- break;
- }
- }
-
- bool ok = i == argsGiven;
- if (ok)
- source->qt_metacall(QMetaObject::InvokeMetaMethod, signalIndex, signalArgs);
-
- delete[] signalArgs;
- delete[] signalValues;
-
- return ok;
-}
-
} //namespace