diff options
author | Fabian Kosmale <fabian.kosmale@qt.io> | 2020-11-19 15:30:45 +0100 |
---|---|---|
committer | Fabian Kosmale <fabian.kosmale@qt.io> | 2020-11-26 17:57:36 +0100 |
commit | b897d69cf7071eb53432ded62fdc80a2a6258e98 (patch) | |
tree | 4b3816e9c2761ce90689e7259de9ee2567cd32a8 /src/qml/qml/qqmlpropertycache.cpp | |
parent | 718472d8e1e30fe2b0bc0e3b514ea0ed20259737 (diff) |
Always fully resolve property data on creation
Resolving things lazily is not really optimizing anything.
Task-number: QTBUG-82931
Change-Id: Iff9e1c7c16ae0dec7e0cec018ed73c6c98542925
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/qml/qml/qqmlpropertycache.cpp')
-rw-r--r-- | src/qml/qml/qqmlpropertycache.cpp | 71 |
1 files changed, 3 insertions, 68 deletions
diff --git a/src/qml/qml/qqmlpropertycache.cpp b/src/qml/qml/qqmlpropertycache.cpp index 20f52af5ea..060437441d 100644 --- a/src/qml/qml/qqmlpropertycache.cpp +++ b/src/qml/qml/qqmlpropertycache.cpp @@ -134,23 +134,6 @@ static void populate(QQmlPropertyData *data, const QMetaProperty &p) data->setRevision(QTypeRevision::fromEncodedVersion(p.revision())); } -void QQmlPropertyData::lazyLoad(const QMetaProperty &p) -{ - populate(this, p); - int type = static_cast<int>(p.userType()); - if (type == QMetaType::QObjectStar) { - setPropType(type); - m_flags.type = Flags::QObjectDerivedType; - } else if (type == QMetaType::QVariant) { - setPropType(type); - m_flags.type = Flags::QVariantType; - } else if (type >= QMetaType::User || type == 0) { - m_flags.notFullyResolved = true; - } else { - setPropType(type); - } -} - void QQmlPropertyData::load(const QMetaProperty &p) { populate(this, p); @@ -188,18 +171,6 @@ void QQmlPropertyData::load(const QMetaMethod &m) setRevision(QTypeRevision::fromEncodedVersion(m.revision())); } -void QQmlPropertyData::lazyLoad(const QMetaMethod &m) -{ - load(m); - - const char *returnType = m.typeName(); - if (!returnType) - returnType = "\0"; - if ((*returnType != 'v') || (qstrcmp(returnType+1, "oid") != 0)) { - m_flags.notFullyResolved = true; - } -} - /*! Creates a new empty QQmlPropertyCache. */ @@ -532,7 +503,7 @@ void QQmlPropertyCache::append(const QMetaObject *metaObject, else data->setFlags(methodFlags); - data->lazyLoad(m); + data->load(m); data->m_flags.setIsDirect(!dynamicMetaObject); Q_ASSERT((allowedRevisionCache.count() - 1) < Q_INT16_MAX); @@ -611,7 +582,7 @@ void QQmlPropertyCache::append(const QMetaObject *metaObject, QQmlPropertyData *data = &propertyIndexCache[ii - propertyIndexCacheStart]; data->setFlags(propertyFlags); - data->lazyLoad(p); + data->load(p); data->setTypeVersion(typeVersion); data->m_flags.setIsDirect(!dynamicMetaObject); @@ -648,42 +619,6 @@ void QQmlPropertyCache::append(const QMetaObject *metaObject, } } -void QQmlPropertyCache::resolve(QQmlPropertyData *data) const -{ - Q_ASSERT(data->notFullyResolved()); - data->m_flags.notFullyResolved = false; - - const QMetaObject *mo = firstCppMetaObject(); - if (data->isFunction()) { - auto metaMethod = mo->method(data->coreIndex()); - const char *retTy = metaMethod.typeName(); - if (!retTy) - retTy = "\0"; - data->setPropType(QMetaType::fromName(retTy).id()); - } else { - auto metaProperty = mo->property(data->coreIndex()); - data->setPropType(metaProperty.metaType().id()); - } - - if (!data->isFunction()) { - if (data->propType() == QMetaType::UnknownType) { - int propOffset = mo->propertyOffset(); - if (mo && data->coreIndex() < propOffset + mo->propertyCount()) { - while (data->coreIndex() < propOffset) { - mo = mo->superClass(); - propOffset = mo->propertyOffset(); - } - - int registerResult = -1; - void *argv[] = { ®isterResult }; - mo->static_metacall(QMetaObject::RegisterPropertyMetaType, data->coreIndex() - propOffset, argv); - data->setPropType(registerResult == -1 ? QMetaType::UnknownType : registerResult); - } - } - flagsForPropertyType(QMetaType(data->propType()), data->m_flags); - } -} - void QQmlPropertyCache::updateRecur(const QMetaObject *metaObject) { if (!metaObject) @@ -827,7 +762,7 @@ QQmlPropertyData *QQmlPropertyCache::findProperty( } while (it != end); } - return ensureResolved(result); + return result; } return nullptr; |