aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2013-09-30 05:52:31 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-30 18:21:39 +0200
commit2ec852ada2a51e1da47a2ccbb93104fc7938bfc4 (patch)
treee056c3f931d00fd007f3b4bd1b5b4b907a953151 /src
parent172111ae0703d223575862f60e0ceba1973fe681 (diff)
Fix composite type registration in the new compiler
When setting a property of a composite type like this property MyType foo: MyType {} and MyType.qml defines the new type, we test for assignability of MyType to the property foo. This test happens before MyType is instantiated and it relies on the meta-type in the CompiledData being set. Therefore this patch makes sure that the meta-type and the list meta-type are set accordingly at type compilation time, not instantiation time, similar to how it's done in the VME. Change-Id: Id7231e0a0113fa63ba6508bfbb1565dd554c5e56 Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/qml/qml/qqmlcompiler_p.h1
-rw-r--r--src/qml/qml/qqmlobjectcreator.cpp2
-rw-r--r--src/qml/qml/qqmltypeloader.cpp17
3 files changed, 18 insertions, 2 deletions
diff --git a/src/qml/qml/qqmlcompiler_p.h b/src/qml/qml/qqmlcompiler_p.h
index 9e63ecb22c..475e43823a 100644
--- a/src/qml/qml/qqmlcompiler_p.h
+++ b/src/qml/qml/qqmlcompiler_p.h
@@ -145,6 +145,7 @@ public:
QHash<int, int> objectIndexToIdForRoot;
bool isComponent(int objectIndex) const { return objectIndexToIdPerComponent.contains(objectIndex); }
+ bool isCompositeType() const { return !datas.at(qmlUnit->indexOfRootObject).isEmpty(); }
// ---
struct Instruction {
diff --git a/src/qml/qml/qqmlobjectcreator.cpp b/src/qml/qml/qqmlobjectcreator.cpp
index 55858e0b12..c320ca9e4a 100644
--- a/src/qml/qml/qqmlobjectcreator.cpp
+++ b/src/qml/qml/qqmlobjectcreator.cpp
@@ -542,8 +542,6 @@ QObject *QmlObjectCreator::create(int subComponentIndex, QObject *parent)
ddata->compiledData->addref();
context->contextObject = instance;
-
- QQmlEnginePrivate::get(engine)->registerInternalCompositeType(compiledData);
}
return instance;
}
diff --git a/src/qml/qml/qqmltypeloader.cpp b/src/qml/qml/qqmltypeloader.cpp
index 849f0f4f2a..63dff012a2 100644
--- a/src/qml/qml/qqmltypeloader.cpp
+++ b/src/qml/qml/qqmltypeloader.cpp
@@ -2408,6 +2408,23 @@ void QQmlTypeData::compile()
errors << resolver.errors;
}
+ if (errors.isEmpty()) {
+ // Add to type registry of composites
+ if (m_compiledData->isCompositeType())
+ QQmlEnginePrivate::get(engine)->registerInternalCompositeType(m_compiledData);
+ else {
+ const QV4::CompiledData::Object *obj = qmlUnit->objectAt(qmlUnit->indexOfRootObject);
+ QQmlCompiledData::TypeReference typeRef = m_compiledData->resolvedTypes.value(obj->inheritedTypeNameIndex);
+ if (typeRef.component) {
+ m_compiledData->metaTypeId = typeRef.component->metaTypeId;
+ m_compiledData->listMetaTypeId = typeRef.component->listMetaTypeId;
+ } else {
+ m_compiledData->metaTypeId = typeRef.type->typeId();
+ m_compiledData->listMetaTypeId = typeRef.type->qListTypeId();
+ }
+ }
+ }
+
if (!errors.isEmpty()) {
setError(errors);
m_compiledData->release();