diff options
| author | Marc Mutz <marc.mutz@qt.io> | 2025-04-04 22:41:25 +0200 |
|---|---|---|
| committer | Marc Mutz <marc.mutz@qt.io> | 2025-04-10 18:47:36 +0200 |
| commit | f2747c62d4732694e0d03638ba0ed7af7ebeaa7a (patch) | |
| tree | 576d6d134222d38aa5f4a4e95d0596ff0fd81074 /src/corelib/kernel | |
| parent | 21c9aac20abd700cf9f4bcacbbbe7751eb0aa364 (diff) | |
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
Pick-to: 6.9
Change-Id: I1cd5b410ee090ab9c6f3aa8095a4d9efae516ac0
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/corelib/kernel')
| -rw-r--r-- | src/corelib/kernel/qmetaobject.cpp | 32 | ||||
| -rw-r--r-- | src/corelib/kernel/qmetaobject_p.h | 20 | ||||
| -rw-r--r-- | 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<int MethodType> 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<MethodSignal>(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<MethodSlot>(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<int MethodType> 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 62202178288..78a28cc50e5 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -2993,7 +2993,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) { @@ -3024,7 +3024,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); @@ -3305,12 +3305,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) @@ -4342,7 +4342,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) |
