diff options
| author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2024-07-10 16:10:55 +0200 |
|---|---|---|
| committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2024-07-10 21:55:50 +0200 |
| commit | acd32d2fd35c507414458973914d0d31a1163456 (patch) | |
| tree | c40bed86cc2ef91318c021bf104610909a8eab4a /sources/pyside6/libpyside/pysidesignal.cpp | |
| parent | 802f93fd6ba215cbee9588616741711a36ecff84 (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.cpp | 46 |
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; |
