[new compiler] Correct the use of default property
authorSimon Hausmann <simon.hausmann@digia.com>
Sun, 19 Jan 2014 13:22:54 +0000 (14:22 +0100)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Mon, 20 Jan 2014 17:59:52 +0000 (18:59 +0100)
When a type declares a new default property, then the old default property
continues to apply to its own bindings.

Change-Id: Iafeec772baa4e1a430b09eed0b348b83984246cd
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
src/qml/compiler/qqmltypecompiler.cpp
src/qml/compiler/qv4compileddata_p.h
src/qml/qml/qqmlobjectcreator.cpp

index 9232aef5c8cf2e1b8347b0879def39ec17c400ce..13b0575337ff186e34d0948a1c966fcb2045a9de 100644 (file)
@@ -793,8 +793,7 @@ void QQmlComponentAndAliasResolver::findAndRegisterImplicitComponents(const QtQm
 
     PropertyResolver propertyResolver(propertyCache);
 
-    bool defaultPropertyQueried = false;
-    QQmlPropertyData *defaultProperty = 0;
+    QQmlPropertyData *defaultProperty = obj->indexOfDefaultProperty != -1 ? propertyCache->parent()->defaultProperty() : propertyCache->defaultProperty();
 
     for (QtQml::Binding *binding = obj->bindings->first; binding; binding = binding->next) {
         if (binding->type != QV4::CompiledData::Binding::Type_Object)
@@ -815,10 +814,6 @@ void QQmlComponentAndAliasResolver::findAndRegisterImplicitComponents(const QtQm
             bool notInRevision = false;
             pd = propertyResolver.property(propertyName, &notInRevision);
         } else {
-            if (!defaultPropertyQueried) {
-                defaultProperty = propertyCache->defaultProperty();
-                defaultPropertyQueried = true;
-            }
             pd = defaultProperty;
         }
         if (!pd || !pd->isQObject())
@@ -1182,7 +1177,7 @@ bool QQmlPropertyValidator::validateObject(int objectIndex)
 
     PropertyResolver propertyResolver(propertyCache);
 
-    QQmlPropertyData *defaultProperty = propertyCache->defaultProperty();
+    QQmlPropertyData *defaultProperty = obj->indexOfDefaultProperty != -1 ? propertyCache->parent()->defaultProperty() : propertyCache->defaultProperty();
 
     const QV4::CompiledData::Binding *binding = obj->bindingTable();
     for (quint32 i = 0; i < obj->nBindings; ++i, ++binding) {
index f9e85ef0807ecae3a1300528cb91f59221ea69e6..83e8058be19ab2aa88c9baa8e5d7b2e7964c70c9 100644 (file)
@@ -371,7 +371,7 @@ struct Object
     // it will be the name of the attached type.
     quint32 inheritedTypeNameIndex;
     quint32 idIndex;
-    quint32 indexOfDefaultProperty;
+    qint32 indexOfDefaultProperty; // -1 means no default property declared in this object
     quint32 nFunctions;
     quint32 offsetToFunctions;
     quint32 nProperties;
index 2cacb0e546d124fe276d3c0cc370597d09db6999..24a83277225664fe0ab114f16543a6679d82eddf 100644 (file)
@@ -588,8 +588,7 @@ void QmlObjectCreator::setupBindings()
     qSwap(_currentList, savedList);
 
     QQmlPropertyData *property = 0;
-    bool defaultPropertyQueried = false;
-    QQmlPropertyData *defaultProperty = 0;
+    QQmlPropertyData *defaultProperty = _compiledObject->indexOfDefaultProperty != -1 ? _propertyCache->parent()->defaultProperty() : _propertyCache->defaultProperty();
 
     QString id = stringAt(_compiledObject->idIndex);
     if (!id.isEmpty()) {
@@ -615,13 +614,8 @@ void QmlObjectCreator::setupBindings()
         if (!property || (i > 0 && (binding - 1)->propertyNameIndex != binding->propertyNameIndex)) {
             if (!name.isEmpty())
                 property = _propertyCache->property(name, _qobject, context);
-            else {
-                if (!defaultPropertyQueried) {
-                    defaultProperty = _propertyCache->defaultProperty();
-                    defaultPropertyQueried = true;
-                }
+            else
                 property = defaultProperty;
-            }
 
             if (property && property->isQList()) {
                 void *argv[1] = { (void*)&_currentList };