aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmltypeloader.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2013-09-17 17:27:07 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-20 14:27:10 +0200
commit8d441936d2e8ab8c39a66831a658c192b80ca597 (patch)
tree61d71c983c685551d403c5b9b91b0e9075c40fc1 /src/qml/qml/qqmltypeloader.cpp
parentc5a8d5b331352e9a1a0a4be7571add641b22238c (diff)
[new compiler] Initial support for components
We use a dedicated pass through the objects in QV4::CompiledData::QmlUnit to determine which objects are QQmlComponents. We remember their object indices as well as to which component other objects belong to (if any). Change-Id: I97929c57e2ccb2fd380d612002d128359c4bc253 Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/qml/qml/qqmltypeloader.cpp')
-rw-r--r--src/qml/qml/qqmltypeloader.cpp28
1 files changed, 22 insertions, 6 deletions
diff --git a/src/qml/qml/qqmltypeloader.cpp b/src/qml/qml/qqmltypeloader.cpp
index 8c8f8c9c25..7a54cab0f2 100644
--- a/src/qml/qml/qqmltypeloader.cpp
+++ b/src/qml/qml/qqmltypeloader.cpp
@@ -2250,12 +2250,28 @@ void QQmlTypeData::compile()
m_compiledData->propertyCaches << propertyCache;
}
- // ### support sub-contexts
- for (quint32 i = 0; i < qmlUnit->nObjects; ++i) {
- const QV4::CompiledData::Object *obj = qmlUnit->objectAt(i);
- const QString &id = qmlUnit->header.stringAt(obj->idIndex);
- if (!id.isEmpty())
- m_compiledData->objectIndexToId.insert(i, m_compiledData->objectIndexToId.count());
+ {
+ // Scan for anonymous components and determine their scopes.
+ QQmlAnonymousComponentResolver resolver(m_compiledData->url, m_compiledData->qmlUnit, m_compiledData->resolvedTypes, m_compiledData->propertyCaches);
+ if (!resolver.resolve())
+ errors << resolver.errors;
+
+ for (quint32 i = 0; i < qmlUnit->nObjects; ++i) {
+ const QV4::CompiledData::Object *obj = qmlUnit->objectAt(i);
+
+ QHash<int, int> *objectIndexToId = 0;
+ QHash<int, int>::ConstIterator componentIt = resolver.objectIndexToComponentIndex.find(i);
+ if (componentIt != resolver.objectIndexToComponentIndex.constEnd()) {
+ int indexOfComponent = resolver.componentRoots[*componentIt];
+ objectIndexToId = &m_compiledData->objectIndexToIdPerComponent[indexOfComponent];
+ } else
+ objectIndexToId = &m_compiledData->objectIndexToIdForRoot;
+
+ const QString &id = qmlUnit->header.stringAt(obj->idIndex);
+ if (id.isEmpty())
+ continue;
+ objectIndexToId->insert(i, objectIndexToId->count());
+ }
}
if (!errors.isEmpty()) {