diff options
| author | Ulf Hermann <ulf.hermann@qt.io> | 2023-05-26 13:06:50 +0200 |
|---|---|---|
| committer | Ulf Hermann <ulf.hermann@qt.io> | 2023-05-30 13:42:35 +0200 |
| commit | 79f811dd09a1ecf31b8649eaf0fe3ef940bcf403 (patch) | |
| tree | ae1b4319c8f8b8812a8aebc24bffb3fcafebfd90 /src/qml/jsruntime/qv4executablecompilationunit.cpp | |
| parent | bd845c2050204eadbac76d35e5f8b012aade4b52 (diff) | |
QtQml: Index inline components by name rather than ID
The ID can only be determined once the compilation unit is present. It
depends on the order of objects in the compiled data. The name is always
available. Indexing by name increases the overhead. However, since we
don't have to "amend" the ID later on and since we only need one
lookup table rather than two per type now, it's probably worth it.
Change-Id: I478de505a1934b5b6ab340b4be4fa5da4e95aeb3
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml/jsruntime/qv4executablecompilationunit.cpp')
| -rw-r--r-- | src/qml/jsruntime/qv4executablecompilationunit.cpp | 78 |
1 files changed, 51 insertions, 27 deletions
diff --git a/src/qml/jsruntime/qv4executablecompilationunit.cpp b/src/qml/jsruntime/qv4executablecompilationunit.cpp index a4293310c4..0bdf5acba4 100644 --- a/src/qml/jsruntime/qv4executablecompilationunit.cpp +++ b/src/qml/jsruntime/qv4executablecompilationunit.cpp @@ -357,6 +357,31 @@ IdentifierHash ExecutableCompilationUnit::createNamedObjectsPerComponent(int com return *namedObjectsPerComponentCache.insert(componentObjectIndex, namedObjectCache); } +template<typename F> +void processInlinComponentType( + const QQmlType &type, const QQmlRefPointer<QV4::ExecutableCompilationUnit> &compilationUnit, + F &&populateIcData) +{ + if (type.isInlineComponentType()) { + QString icRootName; + if (compilationUnit->icRootName) { + icRootName = type.elementName(); + std::swap(*compilationUnit->icRootName, icRootName); + } else { + compilationUnit->icRootName = std::make_unique<QString>(type.elementName()); + } + + populateIcData(); + + if (icRootName.isEmpty()) + compilationUnit->icRootName.reset(); + else + std::swap(*compilationUnit->icRootName, icRootName); + } else { + populateIcData(); + } +} + void ExecutableCompilationUnit::finalizeCompositeType(CompositeMetaTypeIds types) { // Add to type registry of composites @@ -402,7 +427,7 @@ void ExecutableCompilationUnit::finalizeCompositeType(CompositeMetaTypeIds types // and in that case we need to add its object count for (auto nodeIt = nodesSorted.rbegin(); nodeIt != nodesSorted.rend(); ++nodeIt) { const auto &ic = allICs.at(nodeIt->index()); - int lastICRoot = ic.objectIndex; + const int lastICRoot = ic.objectIndex; for (int i = ic.objectIndex; i<objectCount(); ++i) { const QV4::CompiledData::Object *obj = objectAt(i); bool leftCurrentInlineComponent @@ -411,24 +436,24 @@ void ExecutableCompilationUnit::finalizeCompositeType(CompositeMetaTypeIds types || !obj->hasFlag(QV4::CompiledData::Object::IsPartOfInlineComponent); if (leftCurrentInlineComponent) break; - inlineComponentData[lastICRoot].totalBindingCount += obj->nBindings; + const QString lastICRootName = stringAt(ic.nameIndex); + inlineComponentData[lastICRootName].totalBindingCount += obj->nBindings; if (auto *typeRef = resolvedTypes.value(obj->inheritedTypeNameIndex)) { const auto type = typeRef->type(); if (type.isValid() && type.parserStatusCast() != -1) - ++inlineComponentData[lastICRoot].totalParserStatusCount; + ++inlineComponentData[lastICRootName].totalParserStatusCount; - ++inlineComponentData[lastICRoot].totalObjectCount; + ++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 - auto icRoot = compilationUnit->icRoot; - if (type.isInlineComponentType()) - icRoot = type.inlineComponentId(); - QScopedValueRollback<int> rollback {compilationUnit->icRoot, icRoot}; - inlineComponentData[lastICRoot].totalBindingCount += compilationUnit->totalBindingsCount(); - inlineComponentData[lastICRoot].totalParserStatusCount += compilationUnit->totalParserStatusCount(); - inlineComponentData[lastICRoot].totalObjectCount += compilationUnit->totalObjectCount(); + processInlinComponentType(type, compilationUnit, [&]() { + auto &icData = inlineComponentData[lastICRootName]; + icData.totalBindingCount += compilationUnit->totalBindingsCount(); + icData.totalParserStatusCount += compilationUnit->totalParserStatusCount(); + icData.totalObjectCount += compilationUnit->totalObjectCount(); + }); } } } @@ -448,13 +473,11 @@ void ExecutableCompilationUnit::finalizeCompositeType(CompositeMetaTypeIds types ++parserStatusCount; ++objectCount; if (const auto compilationUnit = typeRef->compilationUnit()) { - auto icRoot = compilationUnit->icRoot; - if (type.isInlineComponentType()) - icRoot = type.inlineComponentId(); - QScopedValueRollback<int> rollback {compilationUnit->icRoot, icRoot}; - bindingCount += compilationUnit->totalBindingsCount(); - parserStatusCount += compilationUnit->totalParserStatusCount(); - objectCount += compilationUnit->totalObjectCount(); + processInlinComponentType(type, compilationUnit, [&](){ + bindingCount += compilationUnit->totalBindingsCount(); + parserStatusCount += compilationUnit->totalParserStatusCount(); + objectCount += compilationUnit->totalObjectCount(); + }); } } } @@ -465,21 +488,21 @@ void ExecutableCompilationUnit::finalizeCompositeType(CompositeMetaTypeIds types } int ExecutableCompilationUnit::totalBindingsCount() const { - if (icRoot == -1) + if (!icRootName) return m_totalBindingsCount; - return inlineComponentData[icRoot].totalBindingCount; + return inlineComponentData[*icRootName].totalBindingCount; } int ExecutableCompilationUnit::totalObjectCount() const { - if (icRoot == -1) + if (!icRootName) return m_totalObjectCount; - return inlineComponentData[icRoot].totalObjectCount; + return inlineComponentData[*icRootName].totalObjectCount; } int ExecutableCompilationUnit::totalParserStatusCount() const { - if (icRoot == -1) + if (!icRootName) return m_totalParserStatusCount; - return inlineComponentData[icRoot].totalParserStatusCount; + return inlineComponentData[*icRootName].totalParserStatusCount; } bool ExecutableCompilationUnit::verifyChecksum(const CompiledData::DependentTypesHasher &dependencyHasher) const @@ -497,11 +520,12 @@ bool ExecutableCompilationUnit::verifyChecksum(const CompiledData::DependentType sizeof(data->dependencyMD5Checksum)) == 0; } -CompositeMetaTypeIds ExecutableCompilationUnit::typeIdsForComponent(int objectid) const +CompositeMetaTypeIds ExecutableCompilationUnit::typeIdsForComponent( + const QString &inlineComponentName) const { - if (objectid == 0) + if (inlineComponentName.isEmpty()) return typeIds; - return inlineComponentData[objectid].typeIds; + return inlineComponentData[inlineComponentName].typeIds; } QStringList ExecutableCompilationUnit::moduleRequests() const |
