summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qmetaobject.cpp
diff options
context:
space:
mode:
authorAhmad Samir <a.samirh78@gmail.com>2025-04-11 23:51:52 +0200
committerAhmad Samir <a.samirh78@gmail.com>2025-06-23 23:21:01 +0300
commit8635b9c2955fe80add75e982647cd3e7883347fa (patch)
tree6de186eb0af9211607dd29224699397684d7bb95 /src/corelib/kernel/qmetaobject.cpp
parent43c5f40dfd3e35590c7e27c4619d4992426a2cfa (diff)
QMetaObjectPrivate: simplify parameterTypeNamesFromSignature()
Take by QByteArrayView instead of `const char *`, this method is only called on a QByteArray so the size is already known. Use the length to check for the end of iteration instead of checking for the closing ')' in multiple places in the while-loops' conditions. Pick-to: 6.10 Change-Id: I272231293d07ae699083d2a38898ea2d3cf0e7a0 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/kernel/qmetaobject.cpp')
-rw-r--r--src/corelib/kernel/qmetaobject.cpp17
1 files changed, 12 insertions, 5 deletions
diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp
index bee788f1d5b..d3d71ccf5d3 100644
--- a/src/corelib/kernel/qmetaobject.cpp
+++ b/src/corelib/kernel/qmetaobject.cpp
@@ -4578,15 +4578,22 @@ int QMetaObjectPrivate::originalClone(const QMetaObject *mobj, int local_method_
Returns the parameter type names extracted from the given \a signature.
*/
-QList<QByteArray> QMetaObjectPrivate::parameterTypeNamesFromSignature(const char *signature)
+QList<QByteArray> QMetaObjectPrivate::parameterTypeNamesFromSignature(QByteArrayView sig)
{
QList<QByteArray> list;
- while (*signature && *signature != '(')
- ++signature;
- while (*signature && *signature != ')' && *++signature != ')') {
+ const char *signature = static_cast<const char *>(memchr(sig.begin(), '(', sig.size()));
+ if (!signature)
+ return {};
+ ++signature; // skip '('
+ if (!sig.endsWith(')'))
+ return {};
+ const char *end = sig.end() - 1; // exclude ')'
+ while (signature != end) {
+ if (*signature == ',')
+ ++signature;
const char *begin = signature;
int level = 0;
- while (*signature && (level > 0 || *signature != ',') && *signature != ')') {
+ while (signature != end && (level > 0 || *signature != ',')) {
if (*signature == '<')
++level;
else if (*signature == '>')