QObject: implement the ### Qt7 for dynamicMetaObject()

As requested in qtbase/5d174877234477a59eb29818d3cfb99fedc3e704.

Change-Id: I5f6568921a25918a5ae3fffdff7c136d3eb455a9
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
This commit is contained in:
Thiago Macieira 2024-11-13 16:27:59 -08:00
parent 9f58dbe7d8
commit 8a4032a05d
12 changed files with 69 additions and 15 deletions

View File

@ -127,11 +127,6 @@ int QQmlProxyMetaObject::metaCall(QObject *o, QMetaObject::Call c, int id, void
return object->qt_metacall(c, id, a);
}
QMetaObject *QQmlProxyMetaObject::toDynamicMetaObject(QObject *)
{
return metaObject;
}
void QQmlProxyMetaObject::objectDestroyed(QObject *object)
{
if (parent)

View File

@ -48,7 +48,14 @@ public:
protected:
int metaCall(QObject *o, QMetaObject::Call _c, int _id, void **_a) override;
QMetaObject *toDynamicMetaObject(QObject *) override;
#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0)
const QMetaObject *toDynamicMetaObject(QObject *) const override
#else
QMetaObject *toDynamicMetaObject(QObject *) override
#endif
{
return metaObject;
}
void objectDestroyed(QObject *object) override;
private:

View File

@ -91,7 +91,11 @@ const QQmlValueType *QQmlGadgetPtrWrapper::valueType() const
return static_cast<const QQmlValueType *>(d->metaObject);
}
#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0)
const QMetaObject *QQmlValueType::toDynamicMetaObject(QObject *) const
#else
QMetaObject *QQmlValueType::toDynamicMetaObject(QObject *)
#endif
{
if (!m_dynamicMetaObject) {
QMetaObjectBuilder builder(m_staticMetaObject);

View File

@ -49,7 +49,11 @@ public:
const QMetaObject *staticMetaObject() const { return m_staticMetaObject; }
// ---- dynamic meta object data interface
#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0)
const QMetaObject *toDynamicMetaObject(QObject *) const override;
#else
QMetaObject *toDynamicMetaObject(QObject *) override;
#endif
void objectDestroyed(QObject *) override;
int metaCall(QObject *obj, QMetaObject::Call type, int _id, void **argv) override;
// ----
@ -57,6 +61,7 @@ public:
private:
QMetaType m_metaType;
const QMetaObject *m_staticMetaObject = nullptr;
QT7_ONLY(mutable const)
QMetaObject *m_dynamicMetaObject = nullptr;
};

View File

@ -390,26 +390,35 @@ bool QQmlInterceptorMetaObject::doIntercept(QMetaObject::Call c, int id, void **
return false;
}
static QMetaObject *stringCastMetaObject(QObject *o, const QMetaObject *top)
static const QMetaObject *stringCastMetaObject(QObject *o, const QMetaObject *top)
{
for (const QMetaObject *mo = top; mo; mo = mo->superClass()) {
if (o->qt_metacast(mo->className()) != nullptr)
return const_cast<QMetaObject *>(mo);
return mo;
}
return nullptr;
}
#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0)
const QMetaObject *QQmlInterceptorMetaObject::toDynamicMetaObject(QObject *o) const
#else
QMetaObject *QQmlInterceptorMetaObject::toDynamicMetaObject(QObject *o)
#endif
{
if (!metaObject)
metaObject = cache->createMetaObject();
const QMetaObject *mo = nullptr;
if (Q_UNLIKELY(metaObject.tag() == MetaObjectInvalid))
return stringCastMetaObject(o, metaObject->superClass());
mo = stringCastMetaObject(o, metaObject->superClass());
if (!mo)
mo = metaObject.data();
// ### Qt7: The const_cast is only due to toDynamicMetaObject having the wrong return type.
// It should be const QMetaObject *. Fix this.
return const_cast<QMetaObject *>(metaObject.data());
#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0)
return mo;
#else
return const_cast<QMetaObject *>(mo);
#endif
}
QQmlVMEMetaObject::QQmlVMEMetaObject(QV4::ExecutionEngine *engine,

View File

@ -108,7 +108,11 @@ public:
static QQmlInterceptorMetaObject *get(QObject *obj);
#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0)
const QMetaObject *toDynamicMetaObject(QObject *o) const override;
#else
QMetaObject *toDynamicMetaObject(QObject *o) override;
#endif
// Used by auto-tests for inspection
QQmlPropertyCache::ConstPtr propertyCache() const { return cache; }

View File

@ -124,7 +124,11 @@ int VDMListDelegateDataType::createProperty(const char *name, const char *)
return propertyIndex + propertyOffset;
}
#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0)
const QMetaObject *VDMListDelegateDataType::toDynamicMetaObject(QObject *object) const
#else
QMetaObject *VDMListDelegateDataType::toDynamicMetaObject(QObject *object)
#endif
{
if (const QQmlRefPointer<QQmlContextData> &contextData
= static_cast<QQmlDMListAccessorData *>(object)->contextData) {
@ -139,8 +143,11 @@ QMetaObject *VDMListDelegateDataType::toDynamicMetaObject(QObject *object)
ddata->propertyCache = propertyCache;
}
// ### Qt 7: Return const from toDynamicMetaObject() and drop the const_cast.
#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0)
return &QQmlDMListAccessorData::staticMetaObject;
#else
return const_cast<QMetaObject *>(&QQmlDMListAccessorData::staticMetaObject);
#endif
}
}

View File

@ -280,7 +280,11 @@ public:
int metaCall(QObject *object, QMetaObject::Call call, int id, void **arguments) final;
int createProperty(const char *name, const char *) final;
#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0)
const QMetaObject *toDynamicMetaObject(QObject *accessors) const final;
#else
QMetaObject *toDynamicMetaObject(QObject *accessors) final;
#endif
QMetaObjectBuilder builder;
QQmlAdaptorModel *model = nullptr;

View File

@ -1570,11 +1570,15 @@ ModelNodeMetaObject::~ModelNodeMetaObject()
{
}
#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0)
const QMetaObject *ModelNodeMetaObject::toDynamicMetaObject(QObject *object) const
#else
QMetaObject *ModelNodeMetaObject::toDynamicMetaObject(QObject *object)
#endif
{
if (!m_initialized) {
m_initialized = true;
initialize();
const_cast<ModelNodeMetaObject *>(this)->initialize();
}
return QQmlOpenMetaObject::toDynamicMetaObject(object);
}

View File

@ -91,7 +91,11 @@ public:
ModelNodeMetaObject(QObject *object, QQmlListModel *model, int elementIndex);
~ModelNodeMetaObject();
#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0)
const QMetaObject *toDynamicMetaObject(QObject *object) const override;
#else
QMetaObject *toDynamicMetaObject(QObject *object) override;
#endif
static ModelNodeMetaObject *get(QObject *obj);
@ -113,7 +117,7 @@ private:
void emitDirectNotifies(const int *changedRoles, int roleCount);
void initialize();
bool m_initialized;
mutable bool m_initialized;
};
namespace QV4 {

View File

@ -25,7 +25,11 @@ public:
free(metaObject);
};
#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0)
const QMetaObject *toDynamicMetaObject(QObject *) const override
#else
QMetaObject *toDynamicMetaObject(QObject *) override
#endif
{
return metaObject;
}

View File

@ -2156,10 +2156,17 @@ public:
QDynamicMetaObjectData::objectDestroyed(object);
}
#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0)
const QMetaObject *toDynamicMetaObject(QObject *) const override
{
return &MetaCallInterceptor::staticMetaObject;
}
#else
QMetaObject *toDynamicMetaObject(QObject *) override
{
return const_cast<QMetaObject *>(&MetaCallInterceptor::staticMetaObject);
}
#endif
int metaCall(QObject *o, QMetaObject::Call call, int idx, void **argv) override
{