diff options
author | Roberto Raggi <roberto.raggi@nokia.com> | 2011-12-15 09:50:51 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-12-15 12:17:58 +0100 |
commit | 9ae39c98f43a29e3f68a1f34469c9ad2551f813c (patch) | |
tree | e395dfcba9f7d8ce3d51b245be449648211fc00d /src/declarative/qml | |
parent | b21f63763d43cecf96c9359d95705411dbdc4ecd (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.cpp | 28 |
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; |