aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2024-01-08 11:31:34 +0100
committerUlf Hermann <ulf.hermann@qt.io>2024-01-13 16:03:58 +0100
commit53f75b7f894ba248554df49627d2f17b3f127e23 (patch)
treeeb57a2ad8c2404bc353985dbbcd450a6180a6f35 /src/qml
parentb5374fdc603b263a02ec1885d81cf1d56b3579a9 (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>
Diffstat (limited to 'src/qml')
-rw-r--r--src/qml/common/qv4compileddata_p.h31
-rw-r--r--src/qml/jsruntime/qv4executablecompilationunit.cpp34
-rw-r--r--src/qml/jsruntime/qv4executablecompilationunit_p.h42
-rw-r--r--src/qml/qml/qqmlmetatype.cpp6
-rw-r--r--src/qml/qml/qqmlmetatypedata.cpp2
-rw-r--r--src/qml/qml/qqmlobjectcreator.cpp12
-rw-r--r--src/qml/qml/qqmlpropertyvalidator.cpp4
-rw-r--r--src/qml/qml/qqmltypedata.cpp6
-rw-r--r--src/qml/qml/qqmltypedata_p.h2
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);