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 | |
| 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')
| -rw-r--r-- | sources/pyside6/libpyside/pysidesignal.cpp | 46 | ||||
| -rw-r--r-- | sources/pyside6/libpyside/pysidesignal.h | 12 | ||||
| -rw-r--r-- | sources/pyside6/libpyside/qobjectconnect.cpp | 15 |
3 files changed, 24 insertions, 49 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; diff --git a/sources/pyside6/libpyside/pysidesignal.h b/sources/pyside6/libpyside/pysidesignal.h index 7493f94b5..b4cce0170 100644 --- a/sources/pyside6/libpyside/pysidesignal.h +++ b/sources/pyside6/libpyside/pysidesignal.h @@ -135,18 +135,8 @@ PYSIDE_API bool checkQtSignal(const char *signature); * @param encodeName Used to specify if the returned signature will be encoded with Qt signal/slot style * @return Return the callback signature **/ -PYSIDE_API QByteArray getCallbackSignature(const char *signal, QObject *receiver, +PYSIDE_API QByteArray getCallbackSignature(QMetaMethod signal, QObject *receiver, PyObject *callback, bool encodeName); - -/** - * This function parses the signature and then returns a list of argument types. - * - * @param signature The signal signature - * @return Return true if this is a Qt Signal, otherwise return false - * @todo replace return type by QList<QByteArray> - **/ -QByteArrayList getArgsFromSignature(const char *signature); - } // namespace PySide::Signal #endif diff --git a/sources/pyside6/libpyside/qobjectconnect.cpp b/sources/pyside6/libpyside/qobjectconnect.cpp index 7df9bf90b..3f7933c5c 100644 --- a/sources/pyside6/libpyside/qobjectconnect.cpp +++ b/sources/pyside6/libpyside/qobjectconnect.cpp @@ -94,7 +94,7 @@ static bool isDeclaredIn(PyObject *method, const char *className) return result; } -static GetReceiverResult getReceiver(QObject *source, const char *signal, +static GetReceiverResult getReceiver(QObject *source, QMetaMethod signal, PyObject *callback) { GetReceiverResult result; @@ -213,7 +213,9 @@ QMetaObject::Connection qobjectConnectCallback(QObject *source, const char *sign return {}; // Extract receiver from callback - const GetReceiverResult receiver = getReceiver(source, signal + 1, callback); + const GetReceiverResult receiver = getReceiver(source, + source->metaObject()->method(signalIndex), + callback); if (receiver.receiver == nullptr && receiver.self == nullptr) return {}; @@ -296,12 +298,17 @@ bool qobjectDisconnectCallback(QObject *source, const char *signal, PyObject *ca if (!PySide::Signal::checkQtSignal(signal)) return false; + const int signalIndex = source->metaObject()->indexOfSignal(signal + 1); + if (signalIndex == -1) + return false; + // Extract receiver from callback - const GetReceiverResult receiver = getReceiver(nullptr, signal, callback); + const GetReceiverResult receiver = getReceiver(nullptr, + source->metaObject()->method(signalIndex), + callback); if (receiver.receiver == nullptr && receiver.self == nullptr) return false; - const int signalIndex = source->metaObject()->indexOfSignal(signal + 1); const int slotIndex = receiver.slotIndex; bool ok{}; |
