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 <thiago.macieira@intel.com>
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
(cherry picked from commit f2747c62d4732694e0d03638ba0ed7af7ebeaa7a)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Marc Mutz 2025-04-04 22:41:25 +02:00 committed by Qt Cherry-pick Bot
parent a589ec7129
commit a50425de58
3 changed files with 31 additions and 31 deletions

View File

@ -644,7 +644,7 @@ int QMetaObject::classInfoCount() const
// matches the given name, argument count and argument types, otherwise // matches the given name, argument count and argument types, otherwise
// returns \c false. // returns \c false.
bool QMetaObjectPrivate::methodMatch(const QMetaObject *m, const QMetaMethod &method, bool QMetaObjectPrivate::methodMatch(const QMetaObject *m, const QMetaMethod &method,
const QByteArray &name, int argc, QByteArrayView name, int argc,
const QArgumentType *types) const QArgumentType *types)
{ {
const QMetaMethod::Data &data = method.data; const QMetaMethod::Data &data = method.data;
@ -702,7 +702,7 @@ QMetaMethod QMetaObjectPrivate::firstMethod(const QMetaObject *baseObject, QByte
*/ */
template<int MethodType> template<int MethodType>
inline int QMetaObjectPrivate::indexOfMethodRelative(const QMetaObject **baseObject, inline int QMetaObjectPrivate::indexOfMethodRelative(const QMetaObject **baseObject,
const QByteArray &name, int argc, QByteArrayView name, int argc,
const QArgumentType *types) const QArgumentType *types)
{ {
for (const QMetaObject *m = *baseObject; m; m = m->d.superdata) { 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); Q_ASSERT(priv(d.data)->revision >= 7);
QArgumentTypeArray types; QArgumentTypeArray types;
QByteArray name = QMetaObjectPrivate::decodeMethodSignature(constructor, types); QByteArrayView name = QMetaObjectPrivate::decodeMethodSignature(constructor, types);
return QMetaObjectPrivate::indexOfConstructor(this, name, types.size(), types.constData()); return QMetaObjectPrivate::indexOfConstructor(this, name, types.size(), types.constData());
} }
@ -756,7 +756,7 @@ int QMetaObject::indexOfMethod(const char *method) const
int i; int i;
Q_ASSERT(priv(m->d.data)->revision >= 7); Q_ASSERT(priv(m->d.data)->revision >= 7);
QArgumentTypeArray types; QArgumentTypeArray types;
QByteArray name = QMetaObjectPrivate::decodeMethodSignature(method, types); QByteArrayView name = QMetaObjectPrivate::decodeMethodSignature(method, types);
i = QMetaObjectPrivate::indexOfMethodRelative<0>(&m, name, types.size(), types.constData()); i = QMetaObjectPrivate::indexOfMethodRelative<0>(&m, name, types.size(), types.constData());
if (i >= 0) if (i >= 0)
i += m->methodOffset(); 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 // Given a method \a signature (e.g. "foo(int,double)"), this function
// populates the argument \a types array and returns the method name. // populates the argument \a types array and returns the method name.
QByteArray QMetaObjectPrivate::decodeMethodSignature( QByteArrayView QMetaObjectPrivate::decodeMethodSignature(
const char *signature, QArgumentTypeArray &types) const char *signature, QArgumentTypeArray &types)
{ {
Q_ASSERT(signature != nullptr); Q_ASSERT(signature != nullptr);
const char *lparens = strchr(signature, '('); const char *lparens = strchr(signature, '(');
if (!lparens) if (!lparens)
return QByteArray(); return QByteArrayView();
const char *rparens = strrchr(lparens + 1, ')'); const char *rparens = strrchr(lparens + 1, ')');
if (!rparens || *(rparens+1)) if (!rparens || *(rparens+1))
return QByteArray(); return QByteArrayView();
int nameLength = lparens - signature; int nameLength = lparens - signature;
argumentTypesFromString(lparens + 1, rparens, types); 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; int i;
Q_ASSERT(priv(m->d.data)->revision >= 7); Q_ASSERT(priv(m->d.data)->revision >= 7);
QArgumentTypeArray types; QArgumentTypeArray types;
QByteArray name = QMetaObjectPrivate::decodeMethodSignature(signal, types); QByteArrayView name = QMetaObjectPrivate::decodeMethodSignature(signal, types);
i = QMetaObjectPrivate::indexOfSignalRelative(&m, name, types.size(), types.constData()); i = QMetaObjectPrivate::indexOfSignalRelative(&m, name, types.size(), types.constData());
if (i >= 0) if (i >= 0)
i += m->methodOffset(); 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 \a baseObject will be adjusted to the enclosing QMetaObject, or \nullptr if the signal is not found
*/ */
int QMetaObjectPrivate::indexOfSignalRelative(const QMetaObject **baseObject, int QMetaObjectPrivate::indexOfSignalRelative(const QMetaObject **baseObject,
const QByteArray &name, int argc, QByteArrayView name, int argc,
const QArgumentType *types) const QArgumentType *types)
{ {
int i = indexOfMethodRelative<MethodSignal>(baseObject, name, argc, types); int i = indexOfMethodRelative<MethodSignal>(baseObject, name, argc, types);
@ -868,7 +868,7 @@ int QMetaObject::indexOfSlot(const char *slot) const
int i; int i;
Q_ASSERT(priv(m->d.data)->revision >= 7); Q_ASSERT(priv(m->d.data)->revision >= 7);
QArgumentTypeArray types; QArgumentTypeArray types;
QByteArray name = QMetaObjectPrivate::decodeMethodSignature(slot, types); QByteArrayView name = QMetaObjectPrivate::decodeMethodSignature(slot, types);
i = QMetaObjectPrivate::indexOfSlotRelative(&m, name, types.size(), types.constData()); i = QMetaObjectPrivate::indexOfSlotRelative(&m, name, types.size(), types.constData());
if (i >= 0) if (i >= 0)
i += m->methodOffset(); i += m->methodOffset();
@ -877,13 +877,13 @@ int QMetaObject::indexOfSlot(const char *slot) const
// same as indexOfSignalRelative but for slots. // same as indexOfSignalRelative but for slots.
int QMetaObjectPrivate::indexOfSlotRelative(const QMetaObject **m, int QMetaObjectPrivate::indexOfSlotRelative(const QMetaObject **m,
const QByteArray &name, int argc, QByteArrayView name, int argc,
const QArgumentType *types) const QArgumentType *types)
{ {
return indexOfMethodRelative<MethodSlot>(m, name, argc, 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 argc, const QArgumentType *types)
{ {
int i = indexOfSignalRelative(&m, name, argc, types); int i = indexOfSignalRelative(&m, name, argc, types);
@ -892,7 +892,7 @@ int QMetaObjectPrivate::indexOfSignal(const QMetaObject *m, const QByteArray &na
return i; 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 argc, const QArgumentType *types)
{ {
int i = indexOfSlotRelative(&m, name, argc, types); int i = indexOfSlotRelative(&m, name, argc, types);
@ -901,7 +901,7 @@ int QMetaObjectPrivate::indexOfSlot(const QMetaObject *m, const QByteArray &name
return i; 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 argc, const QArgumentType *types)
{ {
int i = indexOfMethodRelative<0>(&m, name, argc, types); int i = indexOfMethodRelative<0>(&m, name, argc, types);
@ -910,7 +910,7 @@ int QMetaObjectPrivate::indexOfMethod(const QMetaObject *m, const QByteArray &na
return i; return i;
} }
int QMetaObjectPrivate::indexOfConstructor(const QMetaObject *m, const QByteArray &name, int QMetaObjectPrivate::indexOfConstructor(const QMetaObject *m, QByteArrayView name,
int argc, const QArgumentType *types) int argc, const QArgumentType *types)
{ {
for (int i = priv(m->d.data)->constructorCount-1; i >= 0; --i) { for (int i = priv(m->d.data)->constructorCount-1; i >= 0; --i) {

View File

@ -130,21 +130,21 @@ struct QMetaObjectPrivate
static int originalClone(const QMetaObject *obj, int local_method_index); static int originalClone(const QMetaObject *obj, int local_method_index);
static QByteArray decodeMethodSignature(const char *signature, static QByteArrayView decodeMethodSignature(const char *signature,
QArgumentTypeArray &types); QArgumentTypeArray &types);
static int indexOfSignalRelative(const QMetaObject **baseObject, static int indexOfSignalRelative(const QMetaObject **baseObject,
const QByteArray &name, int argc, QByteArrayView name, int argc,
const QArgumentType *types); const QArgumentType *types);
static int indexOfSlotRelative(const QMetaObject **m, static int indexOfSlotRelative(const QMetaObject **m,
const QByteArray &name, int argc, QByteArrayView name, int argc,
const QArgumentType *types); 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); 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); 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); 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); int argc, const QArgumentType *types);
enum class Which { Name, Alias }; enum class Which { Name, Alias };
@ -190,11 +190,11 @@ struct QMetaObjectPrivate
template<int MethodType> template<int MethodType>
static inline int indexOfMethodRelative(const QMetaObject **baseObject, static inline int indexOfMethodRelative(const QMetaObject **baseObject,
const QByteArray &name, int argc, QByteArrayView name, int argc,
const QArgumentType *types); const QArgumentType *types);
static bool methodMatch(const QMetaObject *m, const QMetaMethod &method, static bool methodMatch(const QMetaObject *m, const QMetaMethod &method,
const QByteArray &name, int argc, QByteArrayView name, int argc,
const QArgumentType *types); const QArgumentType *types);
Q_CORE_EXPORT static QMetaMethod firstMethod(const QMetaObject *baseObject, QByteArrayView name); Q_CORE_EXPORT static QMetaMethod firstMethod(const QMetaObject *baseObject, QByteArrayView name);

View File

@ -2990,7 +2990,7 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const char *sign
++signal; // skip code ++signal; // skip code
QArgumentTypeArray signalTypes; QArgumentTypeArray signalTypes;
Q_ASSERT(QMetaObjectPrivate::get(smeta)->revision >= 7); Q_ASSERT(QMetaObjectPrivate::get(smeta)->revision >= 7);
QByteArray signalName = QMetaObjectPrivate::decodeMethodSignature(signal, signalTypes); QByteArrayView signalName = QMetaObjectPrivate::decodeMethodSignature(signal, signalTypes);
int signal_index = QMetaObjectPrivate::indexOfSignalRelative( int signal_index = QMetaObjectPrivate::indexOfSignalRelative(
&smeta, signalName, signalTypes.size(), signalTypes.constData()); &smeta, signalName, signalTypes.size(), signalTypes.constData());
if (signal_index < 0) { if (signal_index < 0) {
@ -3021,7 +3021,7 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const char *sign
++method; // skip code ++method; // skip code
QArgumentTypeArray methodTypes; QArgumentTypeArray methodTypes;
QByteArray methodName = QMetaObjectPrivate::decodeMethodSignature(method, methodTypes); QByteArrayView methodName = QMetaObjectPrivate::decodeMethodSignature(method, methodTypes);
const QMetaObject *rmeta = receiver->metaObject(); const QMetaObject *rmeta = receiver->metaObject();
int method_index_relative = -1; int method_index_relative = -1;
Q_ASSERT(QMetaObjectPrivate::get(rmeta)->revision >= 7); Q_ASSERT(QMetaObjectPrivate::get(rmeta)->revision >= 7);
@ -3302,12 +3302,12 @@ bool QObject::disconnect(const QObject *sender, const char *signal,
*/ */
bool res = false; bool res = false;
const QMetaObject *smeta = sender->metaObject(); const QMetaObject *smeta = sender->metaObject();
QByteArray signalName; QByteArrayView signalName;
QArgumentTypeArray signalTypes; QArgumentTypeArray signalTypes;
Q_ASSERT(QMetaObjectPrivate::get(smeta)->revision >= 7); Q_ASSERT(QMetaObjectPrivate::get(smeta)->revision >= 7);
if (signal) if (signal)
signalName = QMetaObjectPrivate::decodeMethodSignature(signal, signalTypes); signalName = QMetaObjectPrivate::decodeMethodSignature(signal, signalTypes);
QByteArray methodName; QByteArrayView methodName;
QArgumentTypeArray methodTypes; QArgumentTypeArray methodTypes;
Q_ASSERT(!receiver || QMetaObjectPrivate::get(receiver->metaObject())->revision >= 7); Q_ASSERT(!receiver || QMetaObjectPrivate::get(receiver->metaObject())->revision >= 7);
if (method) if (method)
@ -4247,7 +4247,7 @@ int QObjectPrivate::signalIndex(const char *signalName,
const QMetaObject *base = q->metaObject(); const QMetaObject *base = q->metaObject();
Q_ASSERT(QMetaObjectPrivate::get(base)->revision >= 7); Q_ASSERT(QMetaObjectPrivate::get(base)->revision >= 7);
QArgumentTypeArray types; QArgumentTypeArray types;
QByteArray name = QMetaObjectPrivate::decodeMethodSignature(signalName, types); QByteArrayView name = QMetaObjectPrivate::decodeMethodSignature(signalName, types);
int relative_index = QMetaObjectPrivate::indexOfSignalRelative( int relative_index = QMetaObjectPrivate::indexOfSignalRelative(
&base, name, types.size(), types.constData()); &base, name, types.size(), types.constData());
if (relative_index < 0) if (relative_index < 0)