aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2014-01-16 14:51:33 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-01-20 11:49:39 +0100
commit3a9e7f056f487c9740621750067781d33a7c9f34 (patch)
tree71dc899d85e825358074b8f48b0212cbe038d11f
parent3e3de9e357fa55074ff6025d68c0477ac5da30ae (diff)
[new compiler] Fix customer parser use with nested objects
Types with a custom parser attached don't need to continue with validation of properties in sub-objects. Change-Id: Ib25f8e037cf651dfb30dd4016f89980612dff4f4 Reviewed-by: Lars Knoll <lars.knoll@digia.com>
-rw-r--r--src/qml/compiler/qqmltypecompiler.cpp33
-rw-r--r--src/qml/compiler/qqmltypecompiler_p.h2
2 files changed, 18 insertions, 17 deletions
diff --git a/src/qml/compiler/qqmltypecompiler.cpp b/src/qml/compiler/qqmltypecompiler.cpp
index a4301fdc08..91f5535f9c 100644
--- a/src/qml/compiler/qqmltypecompiler.cpp
+++ b/src/qml/compiler/qqmltypecompiler.cpp
@@ -1104,21 +1104,7 @@ QQmlPropertyValidator::QQmlPropertyValidator(QQmlTypeCompiler *typeCompiler)
bool QQmlPropertyValidator::validate()
{
- for (quint32 i = 0; i < qmlUnit->nObjects; ++i) {
- const QV4::CompiledData::Object *obj = qmlUnit->objectAt(i);
- if (stringAt(obj->inheritedTypeNameIndex).isEmpty())
- continue;
-
- if (isComponent(i))
- continue;
-
- QQmlPropertyCache *propertyCache = propertyCaches.value(i);
- Q_ASSERT(propertyCache);
-
- if (!validateObject(obj, i, propertyCache))
- return false;
- }
- return true;
+ return validateObject(qmlUnit->indexOfRootObject);
}
const QQmlImports &QQmlPropertyValidator::imports() const
@@ -1126,8 +1112,18 @@ const QQmlImports &QQmlPropertyValidator::imports() const
return *compiler->imports();
}
-bool QQmlPropertyValidator::validateObject(const QV4::CompiledData::Object *obj, int objectIndex, QQmlPropertyCache *propertyCache)
+bool QQmlPropertyValidator::validateObject(int objectIndex)
{
+ const QV4::CompiledData::Object *obj = qmlUnit->objectAt(objectIndex);
+ if (stringAt(obj->inheritedTypeNameIndex).isEmpty())
+ return true;
+
+ if (isComponent(objectIndex))
+ return true;
+
+ QQmlPropertyCache *propertyCache = propertyCaches.at(objectIndex);
+ Q_ASSERT(propertyCache);
+
QQmlCustomParser *customParser = 0;
QQmlCompiledData::TypeReference objectType = resolvedTypes.value(obj->inheritedTypeNameIndex);
if (objectType.type)
@@ -1140,6 +1136,11 @@ bool QQmlPropertyValidator::validateObject(const QV4::CompiledData::Object *obj,
const QV4::CompiledData::Binding *binding = obj->bindingTable();
for (quint32 i = 0; i < obj->nBindings; ++i, ++binding) {
+ if (binding->type >= QV4::CompiledData::Binding::Type_Object && !customParser) {
+ if (!validateObject(binding->value.objectIndex))
+ return false;
+ }
+
if (binding->type == QV4::CompiledData::Binding::Type_AttachedProperty
|| binding->type == QV4::CompiledData::Binding::Type_GroupProperty) {
if (customParser)
diff --git a/src/qml/compiler/qqmltypecompiler_p.h b/src/qml/compiler/qqmltypecompiler_p.h
index 248cd12796..4fde8f58c2 100644
--- a/src/qml/compiler/qqmltypecompiler_p.h
+++ b/src/qml/compiler/qqmltypecompiler_p.h
@@ -185,7 +185,7 @@ public:
private:
- bool validateObject(const QV4::CompiledData::Object *obj, int objectIndex, QQmlPropertyCache *propertyCache);
+ bool validateObject(int objectIndex);
bool isComponent(int objectIndex) const { return objectIndexToIdPerComponent.contains(objectIndex); }