From 3a9e7f056f487c9740621750067781d33a7c9f34 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Thu, 16 Jan 2014 14:51:33 +0100 Subject: [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 --- src/qml/compiler/qqmltypecompiler.cpp | 33 +++++++++++++++++---------------- src/qml/compiler/qqmltypecompiler_p.h | 2 +- 2 files changed, 18 insertions(+), 17 deletions(-) (limited to 'src') 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); } -- cgit v1.2.3