aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4executablecompilationunit.cpp
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2023-05-26 13:06:50 +0200
committerUlf Hermann <ulf.hermann@qt.io>2023-05-30 13:42:35 +0200
commit79f811dd09a1ecf31b8649eaf0fe3ef940bcf403 (patch)
treeae1b4319c8f8b8812a8aebc24bffb3fcafebfd90 /src/qml/jsruntime/qv4executablecompilationunit.cpp
parentbd845c2050204eadbac76d35e5f8b012aade4b52 (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.cpp78
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