summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qmetaobject.cpp
diff options
context:
space:
mode:
authorAhmad Samir <a.samirh78@gmail.com>2023-07-27 17:10:58 +0300
committerAhmad Samir <a.samirh78@gmail.com>2023-10-27 18:44:34 +0300
commit56b8048ab98aae3780962fb84709b968a81f62ab (patch)
treee7f5598349e4bbdbdb4b4b970926b501d7308fdd /src/corelib/kernel/qmetaobject.cpp
parente0573e73645c0f57e46332a94160e28eb6c8ebac (diff)
QMetaObject: change static objectClassName() to return a QBAV
QBAV has an operator==(), among other things. Internally QMetaObject only supports Latin-1, however that is an implementation detail that shouldn't be exposed in public API. Since some public methods will be changed to take a view, a QBAV, use QBAV internally too to keep the code consistent. Also change QMetaObject_findMetaObject() to take a view, this is more robust as it can work with other string data that isn't necessarlify null-terminated (e.g. a sliced() view, which will happen in later commits). Change-Id: I346d7910ad8fa30951a7168e9b257f039f016298 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/kernel/qmetaobject.cpp')
-rw-r--r--src/corelib/kernel/qmetaobject.cpp25
1 files changed, 12 insertions, 13 deletions
diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp
index 0728d48e35..be7bd7c6c1 100644
--- a/src/corelib/kernel/qmetaobject.cpp
+++ b/src/corelib/kernel/qmetaobject.cpp
@@ -334,9 +334,9 @@ int QMetaObject::metacall(QObject *object, Call cl, int idx, void **argv)
return object->qt_metacall(cl, idx, argv);
}
-static inline const char *objectClassName(const QMetaObject *m)
+static inline QByteArrayView objectClassName(const QMetaObject *m)
{
- return rawStringData(m, priv(m->d.data)->className);
+ return stringDataView(m, priv(m->d.data)->className);
}
/*!
@@ -346,7 +346,7 @@ static inline const char *objectClassName(const QMetaObject *m)
*/
const char *QMetaObject::className() const
{
- return objectClassName(this);
+ return objectClassName(this).constData();
}
/*!
@@ -401,7 +401,7 @@ const QObject *QMetaObject::cast(const QObject *obj) const
*/
QString QMetaObject::tr(const char *s, const char *c, int n) const
{
- return QCoreApplication::translate(objectClassName(this), s, c, n);
+ return QCoreApplication::translate(className(), s, c, n);
}
#endif // QT_NO_TRANSLATION
@@ -833,7 +833,7 @@ int QMetaObjectPrivate::indexOfSignalRelative(const QMetaObject **baseObject,
QMetaMethod conflictMethod = m->d.superdata->method(conflict);
qWarning("QMetaObject::indexOfSignal: signal %s from %s redefined in %s",
conflictMethod.methodSignature().constData(),
- objectClassName(m->d.superdata), objectClassName(m));
+ m->d.superdata->className(), m->className());
}
}
#endif
@@ -1032,10 +1032,10 @@ bool QMetaObjectPrivate::checkConnectArgs(const QMetaMethodPrivate *signal,
return true;
}
-static const QMetaObject *QMetaObject_findMetaObject(const QMetaObject *self, const char *name)
+static const QMetaObject *QMetaObject_findMetaObject(const QMetaObject *self, QByteArrayView name)
{
while (self) {
- if (strcmp(objectClassName(self), name) == 0)
+ if (objectClassName(self) == name)
return self;
if (self->d.relatedMetaObjects) {
Q_ASSERT(priv(self->d.data)->revision >= 2);
@@ -3185,7 +3185,7 @@ bool QMetaEnum::isScoped() const
*/
const char *QMetaEnum::scope() const
{
- return mobj ? objectClassName(mobj) : nullptr;
+ return mobj ? mobj->className() : nullptr;
}
/*!
@@ -3281,12 +3281,11 @@ int QMetaEnum::keysToValue(const char *keys, bool *ok) const
}
return std::nullopt;
};
- auto className = [&] { return stringDataView(mobj, priv(mobj->d.data)->className); };
int value = 0;
for (const QLatin1StringView &untrimmed : qTokenize(QLatin1StringView{keys}, u'|')) {
const auto parsed = parse_scope(untrimmed.trimmed());
- if (parsed.scope && *parsed.scope != className())
+ if (parsed.scope && *parsed.scope != objectClassName(mobj))
return -1; // wrong type name in qualified name
if (auto thisValue = lookup(parsed.key))
value |= *thisValue;
@@ -3607,7 +3606,7 @@ QMetaProperty::QMetaProperty(const QMetaObject *mobj, int index)
if (menum.isValid())
return;
const char *enum_name = type;
- const char *scope_name = objectClassName(mobj);
+ const char *scope_name = mobj->className();
char *scope_buffer = nullptr;
const char *colon = strrchr(enum_name, ':');
@@ -3626,7 +3625,7 @@ QMetaProperty::QMetaProperty(const QMetaObject *mobj, int index)
if (qstrcmp(scope_name, "Qt") == 0)
scope = &Qt::staticMetaObject;
else
- scope = QMetaObject_findMetaObject(mobj, scope_name);
+ scope = QMetaObject_findMetaObject(mobj, QByteArrayView(scope_name));
if (scope)
menum = scope->enumerator(scope->indexOfEnumerator(enum_name));
if (scope_buffer)
@@ -3931,7 +3930,7 @@ int QMetaProperty::notifySignalIndex() const
return idx + m->methodOffset();
} else {
qWarning("QMetaProperty::notifySignal: cannot find the NOTIFY signal %s in class %s for property '%s'",
- signalName.constData(), objectClassName(mobj), name());
+ signalName.constData(), mobj->className(), name());
return -1;
}
}