diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2013-09-22 11:32:26 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-22 15:29:08 +0200 |
commit | 5c153bd8aa197025c70bdd52d6181ee5bd2197f6 (patch) | |
tree | 306f24be150c12f34cc9c13bb3f16d1ae52dc9ce /src | |
parent | 1fb3cd12c8cdc76d1986736fbd60b5810cc17045 (diff) |
Fix grouped property access for non-value type properties
If we don't have a value type, read the grouped property as QObject
instance and populate that instead.
Fixes tst_qqmllanguage::deepProperty
Change-Id: I9a8d5f929a9c0ebb39461863f6a93b3f35274f97
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/qml/qml/qqmlobjectcreator.cpp | 44 |
1 files changed, 35 insertions, 9 deletions
diff --git a/src/qml/qml/qqmlobjectcreator.cpp b/src/qml/qml/qqmlobjectcreator.cpp index fe7995ea59..5bcf134128 100644 --- a/src/qml/qml/qqmlobjectcreator.cpp +++ b/src/qml/qml/qqmlobjectcreator.cpp @@ -1010,19 +1010,45 @@ bool QmlObjectCreator::setPropertyValue(QQmlPropertyData *property, int bindingI if (binding->type == QV4::CompiledData::Binding::Type_GroupProperty) { const QV4::CompiledData::Object *obj = qmlUnit->objectAt(binding->value.objectIndex); if (stringAt(obj->inheritedTypeNameIndex).isEmpty()) { - QQmlValueType *valueType = QQmlValueTypeFactory::valueType(property->propType); - if (!valueType) { - recordError(binding->location, tr("Cannot set properties on %1 as it is null").arg(stringAt(binding->propertyNameIndex))); - return false; - } - valueType->read(_qobject, property->coreIndex); + QQmlEnginePrivate *enginePrivate = QQmlEnginePrivate::get(engine); + QQmlRefPointer<QQmlPropertyCache> groupedObjCache; + QObject *groupedObjInstance = 0; + QQmlValueType *valueType = 0; + + if (QQmlValueTypeFactory::isValueType(property->propType)) { + valueType = QQmlValueTypeFactory::valueType(property->propType); + if (!valueType) { + recordError(binding->location, tr("Cannot set properties on %1 as it is null").arg(stringAt(binding->propertyNameIndex))); + return false; + } - QQmlRefPointer<QQmlPropertyCache> cache = QQmlEnginePrivate::get(engine)->cache(valueType); - if (!populateInstance(binding->value.objectIndex, valueType, cache, _qobject)) + valueType->read(_qobject, property->coreIndex); + + groupedObjCache = enginePrivate->cache(valueType); + groupedObjInstance = valueType; + } else { + groupedObjCache = enginePrivate->propertyCacheForType(property->propType); + if (!groupedObjCache) { + recordError(binding->location, tr("Invalid grouped property access")); + return false; + } + groupedObjInstance = valueType; + + void *argv[1] = { &groupedObjInstance }; + QMetaObject::metacall(_qobject, QMetaObject::ReadProperty, property->coreIndex, argv); + if (!groupedObjInstance) { + recordError(binding->location, tr("Cannot set properties on %1 as it is null").arg(stringAt(binding->propertyNameIndex))); + return false; + } + } + + if (!populateInstance(binding->value.objectIndex, groupedObjInstance, groupedObjCache, _qobject)) return false; - valueType->write(_qobject, property->coreIndex, QQmlPropertyPrivate::BypassInterceptor); + if (valueType) + valueType->write(_qobject, property->coreIndex, QQmlPropertyPrivate::BypassInterceptor); + return true; } } |