aboutsummaryrefslogtreecommitdiffstats
path: root/sources/pyside6/libpyside/pysidesignal.cpp
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2024-07-10 16:10:55 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2024-07-10 21:55:50 +0200
commitacd32d2fd35c507414458973914d0d31a1163456 (patch)
treec40bed86cc2ef91318c021bf104610909a8eab4a /sources/pyside6/libpyside/pysidesignal.cpp
parent802f93fd6ba215cbee9588616741711a36ecff84 (diff)
libpyside: Avoid splitting/reassembling of signal/slot signatures
Instead of parsing the signature from the string, pass the signal QMetaMethod into getReceiver(), which has the parameter types. The helper getArgsFromSignature() can then be removed. Task-number: PYSIDE-2810 Change-Id: I506e058d3fbe1cb0d6db599742a0ffc35db634d4 Reviewed-by: Christian Tismer <tismer@stackless.com>
Diffstat (limited to 'sources/pyside6/libpyside/pysidesignal.cpp')
-rw-r--r--sources/pyside6/libpyside/pysidesignal.cpp46
1 files changed, 12 insertions, 34 deletions
diff --git a/sources/pyside6/libpyside/pysidesignal.cpp b/sources/pyside6/libpyside/pysidesignal.cpp
index 5b45da18f..e85ce99a6 100644
--- a/sources/pyside6/libpyside/pysidesignal.cpp
+++ b/sources/pyside6/libpyside/pysidesignal.cpp
@@ -1193,34 +1193,7 @@ EmitterData getEmitterData(PySideSignalInstance *signal)
return result;
}
-QByteArrayList getArgsFromSignature(const char *signature)
-{
- QByteArrayView qsignature = QByteArrayView(signature).trimmed();
- QByteArrayList result;
-
- if (qsignature.contains("()") || qsignature.contains("(void)"))
- return result;
- if (!qsignature.endsWith(')'))
- return result;
- const auto paren = qsignature.indexOf('(');
- if (paren < 0)
- return result;
-
- qsignature.chop(1);
- qsignature = qsignature.sliced(paren + 1);
- while (true) {
- auto next = qsignature.indexOf(',');
- if (next == -1) {
- result.append(qsignature.trimmed().toByteArray());
- break;
- }
- result.append(qsignature.sliced(0, next).trimmed().toByteArray());
- qsignature = qsignature.sliced(next + 1);
- }
- return result;
-}
-
-QByteArray getCallbackSignature(const char *signal, QObject *receiver,
+QByteArray getCallbackSignature(QMetaMethod signal, QObject *receiver,
PyObject *callback, bool encodeName)
{
QByteArray functionName;
@@ -1267,7 +1240,7 @@ QByteArray getCallbackSignature(const char *signal, QObject *receiver,
for (int i = 0, count = mo->methodCount(); i < count; ++i) {
QMetaMethod me = mo->method(i);
if ((strncmp(me.methodSignature(), prefix, prefix.size()) == 0) &&
- QMetaObject::checkConnectArgs(signal, me.methodSignature())) {
+ QMetaObject::checkConnectArgs(signal, me)) {
numArgs = me.parameterTypes().size() + useSelf;
break;
}
@@ -1293,14 +1266,19 @@ QByteArray getCallbackSignature(const char *signal, QObject *receiver,
functionName[functionName.size() - 1] = '_';
}
QByteArray signature = encodeName ? codeCallbackName(callback, functionName) : functionName;
- QByteArrayList args = getArgsFromSignature(signal);
+ QByteArrayList args = signal.parameterTypes();
signature.append(u'(');
- if (numArgs != -1) {
- while (!args.isEmpty() && (args.size() > (numArgs - useSelf)))
- args.removeLast();
+
+ int slotArgumentCount = signal.parameterCount();
+ if (numArgs != -1 && slotArgumentCount > (numArgs - useSelf))
+ slotArgumentCount = numArgs - useSelf;
+
+ for (int i = 0; i < slotArgumentCount; ++i) {
+ if (i > 0)
+ signature.append(',');
+ signature.append(signal.parameterTypeName(i));
}
- signature.append(args.join(','));
signature.append(')');
return signature;