diff options
author | Ahmad Samir <a.samirh78@gmail.com> | 2023-07-27 17:10:58 +0300 |
---|---|---|
committer | Ahmad Samir <a.samirh78@gmail.com> | 2023-10-27 18:44:34 +0300 |
commit | 56b8048ab98aae3780962fb84709b968a81f62ab (patch) | |
tree | e7f5598349e4bbdbdb4b4b970926b501d7308fdd /src/corelib/kernel/qmetaobject.cpp | |
parent | e0573e73645c0f57e46332a94160e28eb6c8ebac (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.cpp | 25 |
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; } } |