aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2013-09-22 11:32:26 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-22 15:29:08 +0200
commit5c153bd8aa197025c70bdd52d6181ee5bd2197f6 (patch)
tree306f24be150c12f34cc9c13bb3f16d1ae52dc9ce /src
parent1fb3cd12c8cdc76d1986736fbd60b5810cc17045 (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.cpp44
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;
}
}