diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2019-11-14 10:30:02 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2019-11-18 10:37:59 +0100 |
commit | 9b2af0c5f581797e0098494efa93365a2dc6d0bf (patch) | |
tree | 05150d0c0dc8fbf9da70a7aa2416fc1b97c2e2f9 /src | |
parent | c5675c9c8f549beb9966644277010eb847c72bcd (diff) |
Retrieve the attached properties base type without recursion
This is probably faster and avoids the deprecation warnings stemming
from deprecated functions calling themselves recursively.
Task-number: QTBUG-80040
Change-Id: I2f65aad3bc7f85b7a7de66d3e76dac1233a58db8
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/qml/qml/qqmlengine.cpp | 4 | ||||
-rw-r--r-- | src/qml/qml/qqmlmetatype.cpp | 8 | ||||
-rw-r--r-- | src/qml/qml/qqmltype.cpp | 36 | ||||
-rw-r--r-- | src/qml/qml/qqmltype_p.h | 1 | ||||
-rw-r--r-- | src/qml/qml/qqmltype_p_p.h | 12 |
5 files changed, 29 insertions, 32 deletions
diff --git a/src/qml/qml/qqmlengine.cpp b/src/qml/qml/qqmlengine.cpp index 435f158e74..2f4abca4b2 100644 --- a/src/qml/qml/qqmlengine.cpp +++ b/src/qml/qml/qqmlengine.cpp @@ -1640,7 +1640,9 @@ QObject *qmlAttachedPropertiesObjectById(int id, const QObject *object, bool cre return nullptr; QQmlEnginePrivate *engine = QQmlEnginePrivate::get(data->context); - return resolveAttachedProperties(QQmlMetaType::attachedPropertiesFuncById(engine, id), data, + + const QQmlType type = QQmlMetaType::qmlType(id, QQmlMetaType::TypeIdCategory::QmlType); + return resolveAttachedProperties(type.attachedPropertiesFunction(engine), data, const_cast<QObject *>(object), create); } diff --git a/src/qml/qml/qqmlmetatype.cpp b/src/qml/qml/qqmlmetatype.cpp index c2674b402a..4f2089b60d 100644 --- a/src/qml/qml/qqmlmetatype.cpp +++ b/src/qml/qml/qqmlmetatype.cpp @@ -924,11 +924,11 @@ int QQmlMetaType::attachedPropertiesFuncId(QQmlEnginePrivate *engine, const QMet for (auto it = data->metaObjectToType.constFind(mo), end = data->metaObjectToType.constEnd(); it != end && it.key() == mo; ++it) { - const QQmlType type(it.value()); - if (type.attachedPropertiesFunction(engine)) - return type.attachedPropertiesId(engine); + if (const QQmlTypePrivate *type = it.value()) { + if (const QQmlTypePrivate *base = type->attachedPropertiesBase(engine)) + return base->index; + } } - return -1; } diff --git a/src/qml/qml/qqmltype.cpp b/src/qml/qml/qqmltype.cpp index 874bcd4bca..4a211ffa53 100644 --- a/src/qml/qml/qqmltype.cpp +++ b/src/qml/qml/qqmltype.cpp @@ -618,28 +618,16 @@ int QQmlType::metaObjectRevision() const QQmlAttachedPropertiesFunc QQmlType::attachedPropertiesFunction(QQmlEnginePrivate *engine) const { - if (!d) - return nullptr; - if (d->regType == CppType) - return d->extraData.cd->attachedPropertiesFunc; - - QQmlType base; - if (d->regType == CompositeType) - base = d->resolveCompositeBaseType(engine); - return base.attachedPropertiesFunction(engine); + if (const QQmlTypePrivate *base = d->attachedPropertiesBase(engine)) + return base->extraData.cd->attachedPropertiesFunc; + return nullptr; } const QMetaObject *QQmlType::attachedPropertiesType(QQmlEnginePrivate *engine) const { - if (!d) - return nullptr; - if (d->regType == CppType) - return d->extraData.cd->attachedPropertiesType; - - QQmlType base; - if (d->regType == CompositeType) - base = d->resolveCompositeBaseType(engine); - return base.attachedPropertiesType(engine); + if (const QQmlTypePrivate *base = d->attachedPropertiesBase(engine)) + return base->extraData.cd->attachedPropertiesType; + return nullptr; } #if QT_DEPRECATED_SINCE(5, 14) @@ -650,15 +638,9 @@ Qt 4.7 and QtQuick 1.0). */ int QQmlType::attachedPropertiesId(QQmlEnginePrivate *engine) const { - if (!d) - return -1; - if (d->regType == CppType) - return d->extraData.cd->attachedPropertiesType ? d->index : -1; - - QQmlType base; - if (d->regType == CompositeType) - base = d->resolveCompositeBaseType(engine); - return base.attachedPropertiesId(engine); + if (const QQmlTypePrivate *base = d->attachedPropertiesBase(engine)) + return base->index; + return -1; } #endif diff --git a/src/qml/qml/qqmltype_p.h b/src/qml/qml/qqmltype_p.h index ec27b38a73..af134b21f1 100644 --- a/src/qml/qml/qqmltype_p.h +++ b/src/qml/qml/qqmltype_p.h @@ -182,6 +182,7 @@ public: }; private: + friend class QQmlTypePrivate; friend uint qHash(const QQmlType &t, uint seed); QQmlRefPointer<const QQmlTypePrivate> d; }; diff --git a/src/qml/qml/qqmltype_p_p.h b/src/qml/qml/qqmltype_p_p.h index 6a2d961de8..51f776178c 100644 --- a/src/qml/qml/qqmltype_p_p.h +++ b/src/qml/qml/qqmltype_p_p.h @@ -82,6 +82,18 @@ public: } } + const QQmlTypePrivate *attachedPropertiesBase(QQmlEnginePrivate *engine) const + { + for (const QQmlTypePrivate *d = this; d; d = d->resolveCompositeBaseType(engine).d.data()) { + if (d->regType == QQmlType::CppType) + return d->extraData.cd->attachedPropertiesType ? d : nullptr; + + if (d->regType != QQmlType::CompositeType) + return nullptr; + } + return nullptr; + } + bool isComposite() const { return regType == QQmlType::CompositeType || regType == QQmlType::CompositeSingletonType; |