aboutsummaryrefslogtreecommitdiffstats
path: root/sources/pyside6
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
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')
-rw-r--r--sources/pyside6/libpyside/pysidesignal.cpp46
-rw-r--r--sources/pyside6/libpyside/pysidesignal.h12
-rw-r--r--sources/pyside6/libpyside/qobjectconnect.cpp15
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{};