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
// 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) {

View File

@ -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);

View File

@ -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)