diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2024-01-08 11:31:34 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2024-01-13 16:03:58 +0100 |
commit | 53f75b7f894ba248554df49627d2f17b3f127e23 (patch) | |
tree | eb57a2ad8c2404bc353985dbbcd450a6180a6f35 | |
parent | b5374fdc603b263a02ec1885d81cf1d56b3579a9 (diff) |
QtQml: Move inlineComponentData and icRootName into base CU
Change-Id: I89e44644b083681f069d1d7a385bec68b4bfd80b
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
-rw-r--r-- | src/qml/common/qv4compileddata_p.h | 31 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4executablecompilationunit.cpp | 34 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4executablecompilationunit_p.h | 42 | ||||
-rw-r--r-- | src/qml/qml/qqmlmetatype.cpp | 6 | ||||
-rw-r--r-- | src/qml/qml/qqmlmetatypedata.cpp | 2 | ||||
-rw-r--r-- | src/qml/qml/qqmlobjectcreator.cpp | 12 | ||||
-rw-r--r-- | src/qml/qml/qqmlpropertyvalidator.cpp | 4 | ||||
-rw-r--r-- | src/qml/qml/qqmltypedata.cpp | 6 | ||||
-rw-r--r-- | src/qml/qml/qqmltypedata_p.h | 2 |
9 files changed, 81 insertions, 58 deletions
diff --git a/src/qml/common/qv4compileddata_p.h b/src/qml/common/qv4compileddata_p.h index 0c7b07936c..69d3462912 100644 --- a/src/qml/common/qv4compileddata_p.h +++ b/src/qml/common/qv4compileddata_p.h @@ -31,10 +31,11 @@ #endif #include <private/qendian_p.h> +#include <private/qqmlnullablevalue_p.h> #include <private/qqmlrefcount_p.h> -#include <private/qv4staticvalue_p.h> +#include <private/qqmltype_p.h> #include <private/qv4compilationunitmapper_p.h> -#include <private/qqmlnullablevalue_p.h> +#include <private/qv4staticvalue_p.h> #include <functional> #include <limits.h> @@ -1424,7 +1425,27 @@ struct TypeReferenceMap : QHash<int, TypeReference> using DependentTypesHasher = std::function<QByteArray()>; -// This is how this hooks into the existing structures: +struct InlineComponentData { + + InlineComponentData() = default; + InlineComponentData( + const QQmlType &qmlType, int objectIndex, int nameIndex, int totalObjectCount, + int totalBindingCount, int totalParserStatusCount) + : qmlType(qmlType) + , objectIndex(objectIndex) + , nameIndex(nameIndex) + , totalObjectCount(totalObjectCount) + , totalBindingCount(totalBindingCount) + , totalParserStatusCount(totalParserStatusCount) + {} + + QQmlType qmlType; + int objectIndex = -1; + int nameIndex = -1; + int totalObjectCount = 0; + int totalBindingCount = 0; + int totalParserStatusCount = 0; +}; struct CompilationUnit final : public QQmlRefCounted<CompilationUnit> { @@ -1439,6 +1460,10 @@ struct CompilationUnit final : public QQmlRefCounted<CompilationUnit> const StaticValue *constants = nullptr; std::unique_ptr<CompilationUnitMapper> backingFile; + + std::unique_ptr<QString> icRootName; + QHash<QString, InlineComponentData> inlineComponentData; + public: using CompiledObject = CompiledData::Object; diff --git a/src/qml/jsruntime/qv4executablecompilationunit.cpp b/src/qml/jsruntime/qv4executablecompilationunit.cpp index 9c67b05e3e..14444c6ed4 100644 --- a/src/qml/jsruntime/qv4executablecompilationunit.cpp +++ b/src/qml/jsruntime/qv4executablecompilationunit.cpp @@ -257,8 +257,6 @@ void ExecutableCompilationUnit::clear() // Clear the QQmlTypes but not the property caches. // The property caches may still be necessary to resolve further types. qmlType = QQmlType(); - for (auto &ic : inlineComponentData) - ic.qmlType = QQmlType(); if (runtimeLookups) { const uint lookupTableSize = unitData()->lookupTableSize; @@ -341,8 +339,9 @@ IdentifierHash ExecutableCompilationUnit::createNamedObjectsPerComponent(int com template<typename F> void processInlinComponentType( - const QQmlType &type, const QQmlRefPointer<QV4::ExecutableCompilationUnit> &compilationUnit, - F &&populateIcData) + const QQmlType &type, + const QQmlRefPointer<QV4::CompiledData::CompilationUnit> &compilationUnit, + F &&populateIcData) { if (type.isInlineComponentType()) { QString icRootName; @@ -433,19 +432,20 @@ void ExecutableCompilationUnit::finalizeCompositeType(const QQmlType &type) if (leftCurrentInlineComponent) break; const QString lastICRootName = stringAt(ic.nameIndex); - inlineComponentData[lastICRootName].totalBindingCount += obj->nBindings; + m_compilationUnit->inlineComponentData[lastICRootName].totalBindingCount + += obj->nBindings; if (auto *typeRef = resolvedTypes.value(obj->inheritedTypeNameIndex)) { const auto type = typeRef->type(); if (type.isValid() && type.parserStatusCast() != -1) - ++inlineComponentData[lastICRootName].totalParserStatusCount; + ++m_compilationUnit->inlineComponentData[lastICRootName].totalParserStatusCount; - ++inlineComponentData[lastICRootName].totalObjectCount; + ++m_compilationUnit->inlineComponentData[lastICRootName].totalObjectCount; if (const auto compilationUnit = typeRef->compilationUnit()) { // if the type is an inline component type, we have to extract the information from it // This requires that inline components are visited in the correct order - processInlinComponentType(type, compilationUnit, [&]() { - auto &icData = inlineComponentData[lastICRootName]; + processInlinComponentType(type, compilationUnit->m_compilationUnit, [&]() { + auto &icData = m_compilationUnit->inlineComponentData[lastICRootName]; icData.totalBindingCount += compilationUnit->totalBindingsCount(); icData.totalParserStatusCount += compilationUnit->totalParserStatusCount(); icData.totalObjectCount += compilationUnit->totalObjectCount(); @@ -469,7 +469,7 @@ void ExecutableCompilationUnit::finalizeCompositeType(const QQmlType &type) ++parserStatusCount; ++objectCount; if (const auto compilationUnit = typeRef->compilationUnit()) { - processInlinComponentType(type, compilationUnit, [&](){ + processInlinComponentType(type, compilationUnit->m_compilationUnit, [&](){ bindingCount += compilationUnit->totalBindingsCount(); parserStatusCount += compilationUnit->totalParserStatusCount(); objectCount += compilationUnit->totalObjectCount(); @@ -484,15 +484,15 @@ void ExecutableCompilationUnit::finalizeCompositeType(const QQmlType &type) } int ExecutableCompilationUnit::totalBindingsCount() const { - if (!icRootName) + if (!m_compilationUnit->icRootName) return m_totalBindingsCount; - return inlineComponentData[*icRootName].totalBindingCount; + return m_compilationUnit->inlineComponentData[*icRootName()].totalBindingCount; } int ExecutableCompilationUnit::totalObjectCount() const { - if (!icRootName) + if (!m_compilationUnit->icRootName) return m_totalObjectCount; - return inlineComponentData[*icRootName].totalObjectCount; + return m_compilationUnit->inlineComponentData[*icRootName()].totalObjectCount; } ResolvedTypeReference *ExecutableCompilationUnit::resolvedType(QMetaType type) const @@ -505,9 +505,9 @@ ResolvedTypeReference *ExecutableCompilationUnit::resolvedType(QMetaType type) c } int ExecutableCompilationUnit::totalParserStatusCount() const { - if (!icRootName) + if (!m_compilationUnit->icRootName) return m_totalParserStatusCount; - return inlineComponentData[*icRootName].totalParserStatusCount; + return m_compilationUnit->inlineComponentData[*icRootName()].totalParserStatusCount; } bool ExecutableCompilationUnit::verifyChecksum(const CompiledData::DependentTypesHasher &dependencyHasher) const @@ -531,7 +531,7 @@ QQmlType ExecutableCompilationUnit::qmlTypeForComponent(const QString &inlineCom { if (inlineComponentName.isEmpty()) return qmlType; - return inlineComponentData[inlineComponentName].qmlType; + return m_compilationUnit->inlineComponentData[inlineComponentName].qmlType; } Heap::Module *ExecutableCompilationUnit::instantiate() diff --git a/src/qml/jsruntime/qv4executablecompilationunit_p.h b/src/qml/jsruntime/qv4executablecompilationunit_p.h index 49de05a227..c8e8d05aac 100644 --- a/src/qml/jsruntime/qv4executablecompilationunit_p.h +++ b/src/qml/jsruntime/qv4executablecompilationunit_p.h @@ -31,27 +31,6 @@ QT_BEGIN_NAMESPACE class QQmlScriptData; class QQmlEnginePrivate; -struct InlineComponentData { - - InlineComponentData() = default; - InlineComponentData( - const QQmlType &qmlType, int objectIndex, int nameIndex, int totalObjectCount, - int totalBindingCount, int totalParserStatusCount) - : qmlType(qmlType) - , objectIndex(objectIndex) - , nameIndex(nameIndex) - , totalObjectCount(totalObjectCount) - , totalBindingCount(totalBindingCount) - , totalParserStatusCount(totalParserStatusCount) {} - - QQmlType qmlType; - int objectIndex = -1; - int nameIndex = -1; - int totalObjectCount = 0; - int totalBindingCount = 0; - int totalParserStatusCount = 0; -}; - namespace QV4 { // index is per-object binding index @@ -129,7 +108,13 @@ public: int m_totalBindingsCount = 0; // Number of bindings used in this type int m_totalParserStatusCount = 0; // Number of instantiated types that are QQmlParserStatus subclasses int m_totalObjectCount = 0; // Number of objects explicitly instantiated - std::unique_ptr<QString> icRootName; + + const QString *icRootName() const { return m_compilationUnit->icRootName.get(); } + QString *icRootName() { return m_compilationUnit->icRootName.get(); } + void setIcRootName(std::unique_ptr<QString> &&icRootName) + { + m_compilationUnit->icRootName = std::move(icRootName); + } int totalBindingsCount() const; int totalParserStatusCount() const; @@ -146,8 +131,6 @@ public: QQmlType qmlType; - QHash<QString, InlineComponentData> inlineComponentData; - int inlineComponentId(const QString &inlineComponentName) const { for (int i = 0; i < objectCount(); ++i) { @@ -332,6 +315,17 @@ public: : nullptr; } + const QHash<QString, CompiledData::InlineComponentData> &inlineComponentData() const + { + return m_compilationUnit->inlineComponentData; + } + + void setInlineComponentData( + const QHash<QString, CompiledData::InlineComponentData> &inlineComponentData) + { + m_compilationUnit->inlineComponentData = inlineComponentData; + } + void populate(); void clear(); diff --git a/src/qml/qml/qqmlmetatype.cpp b/src/qml/qml/qqmlmetatype.cpp index a8995d9a4a..566ac0744d 100644 --- a/src/qml/qml/qqmlmetatype.cpp +++ b/src/qml/qml/qqmlmetatype.cpp @@ -1550,7 +1550,7 @@ static int doCountInternalCompositeTypeSelfReferences( }; doCheck(compilationUnit->qmlType.typeId().iface()); - for (auto &&inlineData: compilationUnit->inlineComponentData) + for (auto &&inlineData: compilationUnit->inlineComponentData()) doCheck(inlineData.qmlType.typeId().iface()); return result; @@ -1940,7 +1940,7 @@ void QQmlMetaType::registerInternalCompositeType( }; doInsert(compilationUnit->qmlType.typeId().iface()); - for (auto &&inlineData: compilationUnit->inlineComponentData) + for (auto &&inlineData: compilationUnit->inlineComponentData()) doInsert(inlineData.qmlType.typeId().iface()); } @@ -1959,7 +1959,7 @@ void QQmlMetaType::unregisterInternalCompositeType( }; doRemove(compilationUnit->qmlType.typeId().iface()); - for (auto &&inlineData: compilationUnit->inlineComponentData) + for (auto &&inlineData: compilationUnit->inlineComponentData()) doRemove(inlineData.qmlType.typeId().iface()); } diff --git a/src/qml/qml/qqmlmetatypedata.cpp b/src/qml/qml/qqmlmetatypedata.cpp index aff847c396..a8f064f41b 100644 --- a/src/qml/qml/qqmlmetatypedata.cpp +++ b/src/qml/qml/qqmlmetatypedata.cpp @@ -244,7 +244,7 @@ static QQmlPropertyCache::ConstPtr propertyCacheForPotentialInlineComponentType( QMetaType t, const QQmlMetaTypeData::CompositeTypes::const_iterator &iter) { if (t != (*iter)->qmlType.typeId()) { // this is an inline component, and what we have in the iterator is currently the parent compilation unit - for (auto &&icDatum: (*iter)->inlineComponentData) + for (auto &&icDatum: (*iter)->inlineComponentData()) if (icDatum.qmlType.typeId() == t) return (*iter)->propertyCaches.at(icDatum.objectIndex); } diff --git a/src/qml/qml/qqmlobjectcreator.cpp b/src/qml/qml/qqmlobjectcreator.cpp index e2aaa330c7..091a91f5f1 100644 --- a/src/qml/qml/qqmlobjectcreator.cpp +++ b/src/qml/qml/qqmlobjectcreator.cpp @@ -1295,24 +1295,24 @@ QObject *QQmlObjectCreator::createInstance(int index, QObject *parent, bool isCo } } else { QString subObjectName; - if (compilationUnit->icRootName) { + if (QString *icRootName = compilationUnit->icRootName()) { subObjectName = type.elementName(); - std::swap(*compilationUnit->icRootName, subObjectName); + std::swap(*icRootName, subObjectName); } else { - compilationUnit->icRootName = std::make_unique<QString>(type.elementName()); + compilationUnit->setIcRootName(std::make_unique<QString>(type.elementName())); } const auto guard = qScopeGuard([&] { if (subObjectName.isEmpty()) - compilationUnit->icRootName.reset(); + compilationUnit->setIcRootName({}); else - std::swap(*compilationUnit->icRootName, subObjectName); + std::swap(*compilationUnit->icRootName(), subObjectName); }); QQmlObjectCreator subCreator(context, compilationUnit, sharedState.data(), isContextObject); instance = subCreator.create( - compilationUnit->inlineComponentId(*compilationUnit->icRootName), + compilationUnit->inlineComponentId(*compilationUnit->icRootName()), nullptr, nullptr, CreationFlags::InlineComponent); if (!instance) { errors += subCreator.errors; diff --git a/src/qml/qml/qqmlpropertyvalidator.cpp b/src/qml/qml/qqmlpropertyvalidator.cpp index 05b31829a7..c023f48eb2 100644 --- a/src/qml/qml/qqmlpropertyvalidator.cpp +++ b/src/qml/qml/qqmlpropertyvalidator.cpp @@ -637,7 +637,7 @@ bool QQmlPropertyValidator::canCoerce(QMetaType to, QQmlPropertyCache::ConstPtr // it is not properly registered at this point, as registration // only occurs after the whole file has been validated // Therefore we need to check the ICs here - for (const auto& icDatum : compilationUnit->inlineComponentData) { + for (const auto& icDatum : compilationUnit->inlineComponentData()) { if (icDatum.qmlType.typeId() == to) { toMo = compilationUnit->propertyCaches.at(icDatum.objectIndex); break; @@ -747,7 +747,7 @@ QQmlError QQmlPropertyValidator::validateObjectBinding(const QQmlPropertyData *p // it is not properly registered at this point, as registration // only occurs after the whole file has been validated // Therefore we need to check the ICs here - for (const auto& icDatum: compilationUnit->inlineComponentData) { + for (const auto& icDatum: compilationUnit->inlineComponentData()) { if (icDatum.qmlType.typeId() == property->propType()) { propertyMetaObject = compilationUnit->propertyCaches.at(icDatum.objectIndex); break; diff --git a/src/qml/qml/qqmltypedata.cpp b/src/qml/qml/qqmltypedata.cpp index 3c306953e1..54a515177e 100644 --- a/src/qml/qml/qqmltypedata.cpp +++ b/src/qml/qml/qqmltypedata.cpp @@ -241,7 +241,7 @@ QQmlError QQmlTypeData::createTypeAndPropertyCaches( Q_ASSERT(m_compiledData); m_compiledData->typeNameCache = typeNameCache; m_compiledData->resolvedTypes = resolvedTypeCache; - m_compiledData->inlineComponentData = m_inlineComponentData; + m_compiledData->setInlineComponentData(m_inlineComponentData); QQmlEnginePrivate * const engine = QQmlEnginePrivate::get(typeLoader()->engine()); @@ -300,6 +300,8 @@ static bool addTypeReferenceChecksumsToHash( // local helper function for inline components namespace { +using InlineComponentData = QV4::CompiledData::InlineComponentData; + template<typename ObjectContainer> void setupICs( const ObjectContainer &container, QHash<QString, InlineComponentData> *icData, @@ -512,7 +514,7 @@ void QQmlTypeData::done() { QQmlEnginePrivate *const enginePrivate = QQmlEnginePrivate::get(typeLoader()->engine()); - m_compiledData->inlineComponentData = m_inlineComponentData; + m_compiledData->setInlineComponentData(m_inlineComponentData); { // Sanity check property bindings QQmlPropertyValidator validator(enginePrivate, m_importCache.data(), m_compiledData); diff --git a/src/qml/qml/qqmltypedata_p.h b/src/qml/qml/qqmltypedata_p.h index edc4db0636..fafb7e4448 100644 --- a/src/qml/qml/qqmltypedata_p.h +++ b/src/qml/qml/qqmltypedata_p.h @@ -83,6 +83,8 @@ protected: QString stringAt(int index) const override; private: + using InlineComponentData = QV4::CompiledData::InlineComponentData; + bool tryLoadFromDiskCache(); bool loadFromSource(); void restoreIR(const QQmlRefPointer<QV4::CompiledData::CompilationUnit> &unit); |