aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative/qml
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2011-12-15 09:50:51 +0100
committerQt by Nokia <qt-info@nokia.com>2011-12-15 12:17:58 +0100
commit9ae39c98f43a29e3f68a1f34469c9ad2551f813c (patch)
treee395dfcba9f7d8ce3d51b245be449648211fc00d /src/declarative/qml
parentb21f63763d43cecf96c9359d95705411dbdc4ecd (diff)
Fix IR code generation for member expressions
The generated code for member expressions (e.g. parent.width) was using a wrong mix of types from the base object and names from the current member expression. Change-Id: I167df285ae44f9dc1538e2b1019998f02a0479a8 Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
Diffstat (limited to 'src/declarative/qml')
-rw-r--r--src/declarative/qml/v4/qv4irbuilder.cpp28
1 files changed, 15 insertions, 13 deletions
diff --git a/src/declarative/qml/v4/qv4irbuilder.cpp b/src/declarative/qml/v4/qv4irbuilder.cpp
index 389533eb60..6afe436377 100644
--- a/src/declarative/qml/v4/qv4irbuilder.cpp
+++ b/src/declarative/qml/v4/qv4irbuilder.cpp
@@ -625,21 +625,23 @@ bool QV4IRBuilder::visit(AST::FieldMemberExpression *ast)
break;
case IR::Name::Property:
- if (baseName->type == IR::ObjectType) {
- QDeclarativePropertyData *data = baseName->property;
- if (!data || data->isFunction())
- return false; // Don't support methods (or non-existing properties ;)
+ if (baseName->type == IR::ObjectType && baseName->meta && baseName->property->isFinal()) {
+ QDeclarativePropertyCache *cache = m_engine->cache(baseName->meta);
+ if (!cache)
+ return false;
+
+ if (QDeclarativePropertyData *data = cache->property(name)) {
+ if (!data->isFinal()) {
+ if (qmlVerboseCompiler())
+ qWarning() << "*** non-final property access:"
+ << (*baseName->id + QLatin1String(".") + ast->name.toString());
+ return false; // We don't know enough about this property
+ }
- if(!data->isFinal()) {
- if (qmlVerboseCompiler())
- qWarning() << "*** non-final property access:"
- << (*baseName->id + QLatin1String(".") + ast->name.toString());
- return false; // We don't know enough about this property
+ IR::Type irType = irTypeFromVariantType(data->propType, m_engine, baseName->meta);
+ _expr.code = _block->SYMBOL(baseName, irType, name,
+ baseName->meta, data, line, column);
}
-
- IR::Type irType = irTypeFromVariantType(data->propType, m_engine, baseName->meta);
- _expr.code = _block->SYMBOL(baseName, irType, name,
- baseName->meta, data, line, column);
}
break;