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:
parent
a589ec7129
commit
a50425de58
@ -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) {
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user