diff options
| author | Ulf Hermann <ulf.hermann@qt.io> | 2024-04-16 17:03:01 +0200 |
|---|---|---|
| committer | Ulf Hermann <ulf.hermann@qt.io> | 2024-04-26 12:18:15 +0000 |
| commit | 8bf5aae19b77b618f3f7a55a59e87c8a319475a8 (patch) | |
| tree | d331328f478ac13593524eaaeb3a874691ccadd2 /src/qmlcompiler/qqmljsfunctioninitializer.cpp | |
| parent | 23fc22e16022e355f2a1aff8705c09b807fbe024 (diff) | |
QtQml: Properly enforce signatures of AOT-compiled functions
Pass the metatypes of the contained types rather than the stored types.
[ChangeLog][QtQml][Important Behavior Changes] The AOT compiled code for
type-annotated JavaScript functions does not let you pass or return
values of the wrong type anymore.
Fixes: QTBUG-119885
Change-Id: I685d398c0745d32a999a3abd76c622a2c0d6651f
Reviewed-by: Olivier De Cannière <olivier.decanniere@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qmlcompiler/qqmljsfunctioninitializer.cpp')
| -rw-r--r-- | src/qmlcompiler/qqmljsfunctioninitializer.cpp | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/src/qmlcompiler/qqmljsfunctioninitializer.cpp b/src/qmlcompiler/qqmljsfunctioninitializer.cpp index 217b00c52c..09928364b1 100644 --- a/src/qmlcompiler/qqmljsfunctioninitializer.cpp +++ b/src/qmlcompiler/qqmljsfunctioninitializer.cpp @@ -116,10 +116,11 @@ void QQmlJSFunctionInitializer::populateSignature( } } - if (!function->returnType) { + if (!function->returnType.isValid()) { if (ast->typeAnnotation) { - function->returnType = m_typeResolver->typeFromAST(ast->typeAnnotation->type); - if (!function->returnType) + function->returnType = m_typeResolver->globalType( + m_typeResolver->typeFromAST(ast->typeAnnotation->type)); + if (!function->returnType.isValid()) signatureError(u"Cannot resolve return type %1"_s.arg( QmlIR::IRBuilder::asString(ast->typeAnnotation->type->typeId))); } @@ -218,9 +219,9 @@ QQmlJSCompilePass::Function QQmlJSFunctionInitializer::run( const auto property = m_objectType->property(propertyName); if (const QQmlJSScope::ConstPtr propertyType = property.type()) { - function.returnType = propertyType->isListProperty() - ? m_typeResolver->qObjectListType() - : propertyType; + function.returnType = m_typeResolver->globalType(propertyType->isListProperty() + ? m_typeResolver->qObjectListType() + : QQmlJSScope::ConstPtr(property.type())); } else { QString message = u"Cannot resolve property type %1 for binding on %2."_s .arg(property.typeName(), propertyName); |
