From a50425de583831ebc08238213e0dc96e627db2b1 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Fri, 4 Apr 2025 22:41:25 +0200 Subject: [PATCH] QMetaObjectPrivate: make decodeMethodSignature() return QByteArrayView ... instead of QByteArray. This is part of a quest to improve string-based connect() performance. Needed to port a few consumers of decodeMethodSignature()'s result from QByteArray to QByteArrayView, too. All private API, so doesn't affect users. This doesn't change anything in tst_bench_qobject's connect_disconnect_benchmark:normalized signature, yet. Task-nunber: QTBUG-135572 Change-Id: I1cd5b410ee090ab9c6f3aa8095a4d9efae516ac0 Reviewed-by: Thiago Macieira Reviewed-by: Ulf Hermann Reviewed-by: Fabian Kosmale (cherry picked from commit f2747c62d4732694e0d03638ba0ed7af7ebeaa7a) Reviewed-by: Qt Cherry-pick Bot --- src/corelib/kernel/qmetaobject.cpp | 32 +++++++++++++++--------------- src/corelib/kernel/qmetaobject_p.h | 20 +++++++++---------- src/corelib/kernel/qobject.cpp | 10 +++++----- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp index c74ab729d2e..17bacd219f0 100644 --- a/src/corelib/kernel/qmetaobject.cpp +++ b/src/corelib/kernel/qmetaobject.cpp @@ -644,7 +644,7 @@ int QMetaObject::classInfoCount() const // matches the given name, argument count and argument types, otherwise // returns \c false. bool QMetaObjectPrivate::methodMatch(const QMetaObject *m, const QMetaMethod &method, - const QByteArray &name, int argc, + QByteArrayView name, int argc, const QArgumentType *types) { const QMetaMethod::Data &data = method.data; @@ -702,7 +702,7 @@ QMetaMethod QMetaObjectPrivate::firstMethod(const QMetaObject *baseObject, QByte */ template inline int QMetaObjectPrivate::indexOfMethodRelative(const QMetaObject **baseObject, - const QByteArray &name, int argc, + QByteArrayView name, int argc, const QArgumentType *types) { for (const QMetaObject *m = *baseObject; m; m = m->d.superdata) { @@ -738,7 +738,7 @@ int QMetaObject::indexOfConstructor(const char *constructor) const { Q_ASSERT(priv(d.data)->revision >= 7); QArgumentTypeArray types; - QByteArray name = QMetaObjectPrivate::decodeMethodSignature(constructor, types); + QByteArrayView name = QMetaObjectPrivate::decodeMethodSignature(constructor, types); return QMetaObjectPrivate::indexOfConstructor(this, name, types.size(), types.constData()); } @@ -756,7 +756,7 @@ int QMetaObject::indexOfMethod(const char *method) const int i; Q_ASSERT(priv(m->d.data)->revision >= 7); QArgumentTypeArray types; - QByteArray name = QMetaObjectPrivate::decodeMethodSignature(method, types); + QByteArrayView name = QMetaObjectPrivate::decodeMethodSignature(method, types); i = QMetaObjectPrivate::indexOfMethodRelative<0>(&m, name, types.size(), types.constData()); if (i >= 0) i += m->methodOffset(); @@ -789,19 +789,19 @@ static void argumentTypesFromString(const char *str, const char *end, // Given a method \a signature (e.g. "foo(int,double)"), this function // populates the argument \a types array and returns the method name. -QByteArray QMetaObjectPrivate::decodeMethodSignature( +QByteArrayView QMetaObjectPrivate::decodeMethodSignature( const char *signature, QArgumentTypeArray &types) { Q_ASSERT(signature != nullptr); const char *lparens = strchr(signature, '('); if (!lparens) - return QByteArray(); + return QByteArrayView(); const char *rparens = strrchr(lparens + 1, ')'); if (!rparens || *(rparens+1)) - return QByteArray(); + return QByteArrayView(); int nameLength = lparens - signature; argumentTypesFromString(lparens + 1, rparens, types); - return QByteArray::fromRawData(signature, nameLength); + return QByteArrayView(signature, nameLength); } /*! @@ -821,7 +821,7 @@ int QMetaObject::indexOfSignal(const char *signal) const int i; Q_ASSERT(priv(m->d.data)->revision >= 7); QArgumentTypeArray types; - QByteArray name = QMetaObjectPrivate::decodeMethodSignature(signal, types); + QByteArrayView name = QMetaObjectPrivate::decodeMethodSignature(signal, types); i = QMetaObjectPrivate::indexOfSignalRelative(&m, name, types.size(), types.constData()); if (i >= 0) i += m->methodOffset(); @@ -835,7 +835,7 @@ int QMetaObject::indexOfSignal(const char *signal) const \a baseObject will be adjusted to the enclosing QMetaObject, or \nullptr if the signal is not found */ int QMetaObjectPrivate::indexOfSignalRelative(const QMetaObject **baseObject, - const QByteArray &name, int argc, + QByteArrayView name, int argc, const QArgumentType *types) { int i = indexOfMethodRelative(baseObject, name, argc, types); @@ -868,7 +868,7 @@ int QMetaObject::indexOfSlot(const char *slot) const int i; Q_ASSERT(priv(m->d.data)->revision >= 7); QArgumentTypeArray types; - QByteArray name = QMetaObjectPrivate::decodeMethodSignature(slot, types); + QByteArrayView name = QMetaObjectPrivate::decodeMethodSignature(slot, types); i = QMetaObjectPrivate::indexOfSlotRelative(&m, name, types.size(), types.constData()); if (i >= 0) i += m->methodOffset(); @@ -877,13 +877,13 @@ int QMetaObject::indexOfSlot(const char *slot) const // same as indexOfSignalRelative but for slots. int QMetaObjectPrivate::indexOfSlotRelative(const QMetaObject **m, - const QByteArray &name, int argc, + QByteArrayView name, int argc, const QArgumentType *types) { return indexOfMethodRelative(m, name, argc, types); } -int QMetaObjectPrivate::indexOfSignal(const QMetaObject *m, const QByteArray &name, +int QMetaObjectPrivate::indexOfSignal(const QMetaObject *m, QByteArrayView name, int argc, const QArgumentType *types) { int i = indexOfSignalRelative(&m, name, argc, types); @@ -892,7 +892,7 @@ int QMetaObjectPrivate::indexOfSignal(const QMetaObject *m, const QByteArray &na return i; } -int QMetaObjectPrivate::indexOfSlot(const QMetaObject *m, const QByteArray &name, +int QMetaObjectPrivate::indexOfSlot(const QMetaObject *m, QByteArrayView name, int argc, const QArgumentType *types) { int i = indexOfSlotRelative(&m, name, argc, types); @@ -901,7 +901,7 @@ int QMetaObjectPrivate::indexOfSlot(const QMetaObject *m, const QByteArray &name return i; } -int QMetaObjectPrivate::indexOfMethod(const QMetaObject *m, const QByteArray &name, +int QMetaObjectPrivate::indexOfMethod(const QMetaObject *m, QByteArrayView name, int argc, const QArgumentType *types) { int i = indexOfMethodRelative<0>(&m, name, argc, types); @@ -910,7 +910,7 @@ int QMetaObjectPrivate::indexOfMethod(const QMetaObject *m, const QByteArray &na return i; } -int QMetaObjectPrivate::indexOfConstructor(const QMetaObject *m, const QByteArray &name, +int QMetaObjectPrivate::indexOfConstructor(const QMetaObject *m, QByteArrayView name, int argc, const QArgumentType *types) { for (int i = priv(m->d.data)->constructorCount-1; i >= 0; --i) { diff --git a/src/corelib/kernel/qmetaobject_p.h b/src/corelib/kernel/qmetaobject_p.h index 1c59a57cce4..3a04516b381 100644 --- a/src/corelib/kernel/qmetaobject_p.h +++ b/src/corelib/kernel/qmetaobject_p.h @@ -130,21 +130,21 @@ struct QMetaObjectPrivate static int originalClone(const QMetaObject *obj, int local_method_index); - static QByteArray decodeMethodSignature(const char *signature, - QArgumentTypeArray &types); + static QByteArrayView decodeMethodSignature(const char *signature, + QArgumentTypeArray &types); static int indexOfSignalRelative(const QMetaObject **baseObject, - const QByteArray &name, int argc, + QByteArrayView name, int argc, const QArgumentType *types); static int indexOfSlotRelative(const QMetaObject **m, - const QByteArray &name, int argc, + QByteArrayView name, int argc, const QArgumentType *types); - static int indexOfSignal(const QMetaObject *m, const QByteArray &name, + static int indexOfSignal(const QMetaObject *m, QByteArrayView name, int argc, const QArgumentType *types); - static int indexOfSlot(const QMetaObject *m, const QByteArray &name, + static int indexOfSlot(const QMetaObject *m, QByteArrayView name, int argc, const QArgumentType *types); - static int indexOfMethod(const QMetaObject *m, const QByteArray &name, + static int indexOfMethod(const QMetaObject *m, QByteArrayView name, int argc, const QArgumentType *types); - static int indexOfConstructor(const QMetaObject *m, const QByteArray &name, + static int indexOfConstructor(const QMetaObject *m, QByteArrayView name, int argc, const QArgumentType *types); enum class Which { Name, Alias }; @@ -190,11 +190,11 @@ struct QMetaObjectPrivate template static inline int indexOfMethodRelative(const QMetaObject **baseObject, - const QByteArray &name, int argc, + QByteArrayView name, int argc, const QArgumentType *types); static bool methodMatch(const QMetaObject *m, const QMetaMethod &method, - const QByteArray &name, int argc, + QByteArrayView name, int argc, const QArgumentType *types); Q_CORE_EXPORT static QMetaMethod firstMethod(const QMetaObject *baseObject, QByteArrayView name); diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index 8a5c8da5af5..ce9c1c1702e 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -2990,7 +2990,7 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const char *sign ++signal; // skip code QArgumentTypeArray signalTypes; Q_ASSERT(QMetaObjectPrivate::get(smeta)->revision >= 7); - QByteArray signalName = QMetaObjectPrivate::decodeMethodSignature(signal, signalTypes); + QByteArrayView signalName = QMetaObjectPrivate::decodeMethodSignature(signal, signalTypes); int signal_index = QMetaObjectPrivate::indexOfSignalRelative( &smeta, signalName, signalTypes.size(), signalTypes.constData()); if (signal_index < 0) { @@ -3021,7 +3021,7 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const char *sign ++method; // skip code QArgumentTypeArray methodTypes; - QByteArray methodName = QMetaObjectPrivate::decodeMethodSignature(method, methodTypes); + QByteArrayView methodName = QMetaObjectPrivate::decodeMethodSignature(method, methodTypes); const QMetaObject *rmeta = receiver->metaObject(); int method_index_relative = -1; Q_ASSERT(QMetaObjectPrivate::get(rmeta)->revision >= 7); @@ -3302,12 +3302,12 @@ bool QObject::disconnect(const QObject *sender, const char *signal, */ bool res = false; const QMetaObject *smeta = sender->metaObject(); - QByteArray signalName; + QByteArrayView signalName; QArgumentTypeArray signalTypes; Q_ASSERT(QMetaObjectPrivate::get(smeta)->revision >= 7); if (signal) signalName = QMetaObjectPrivate::decodeMethodSignature(signal, signalTypes); - QByteArray methodName; + QByteArrayView methodName; QArgumentTypeArray methodTypes; Q_ASSERT(!receiver || QMetaObjectPrivate::get(receiver->metaObject())->revision >= 7); if (method) @@ -4247,7 +4247,7 @@ int QObjectPrivate::signalIndex(const char *signalName, const QMetaObject *base = q->metaObject(); Q_ASSERT(QMetaObjectPrivate::get(base)->revision >= 7); QArgumentTypeArray types; - QByteArray name = QMetaObjectPrivate::decodeMethodSignature(signalName, types); + QByteArrayView name = QMetaObjectPrivate::decodeMethodSignature(signalName, types); int relative_index = QMetaObjectPrivate::indexOfSignalRelative( &base, name, types.size(), types.constData()); if (relative_index < 0)