From 9ae39c98f43a29e3f68a1f34469c9ad2551f813c Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Thu, 15 Dec 2011 09:50:51 +0100 Subject: 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 --- src/declarative/qml/v4/qv4irbuilder.cpp | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) (limited to 'src/declarative/qml') 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; -- cgit v1.2.3