From 8a22282f6aaea10281417e14f1e8e4799bd348d0 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Tue, 26 Sep 2023 15:02:57 +0200 Subject: [PATCH] QmlCompiler: Do not crash when trying to iterate non-iterables Amends commit a173d50a9e54d2a21a5207f6c66bb54bb8f3a612. Change-Id: I2774cd483e073c69f2ceff345436fbdd2a9ac692 Reviewed-by: Sami Shalayel Reviewed-by: Fabian Kosmale Reviewed-by: Semih Yavuz --- src/qmlcompiler/qqmljscodegenerator.cpp | 10 +++++++++- tests/auto/qml/qmlcppcodegen/data/failures.qml | 7 +++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/qmlcompiler/qqmljscodegenerator.cpp b/src/qmlcompiler/qqmljscodegenerator.cpp index 24a308d4b6..65dea0304d 100644 --- a/src/qmlcompiler/qqmljscodegenerator.cpp +++ b/src/qmlcompiler/qqmljscodegenerator.cpp @@ -2327,6 +2327,10 @@ void QQmlJSCodeGenerator::generate_GetIterator(int iterator) reject(u"iterator on non-list type"_s); const QQmlJSRegisterContent iteratorType = m_state.accumulatorOut(); + if (!iteratorType.isProperty()) { + reject(u"using non-iterator as iterator"_s); + return; + } const QString identifier = QString::number(iteratorType.baseLookupIndex()); const QString iteratorName = m_state.accumulatorVariableOut + u"Iterator" + identifier; @@ -2359,8 +2363,12 @@ void QQmlJSCodeGenerator::generate_IteratorNext(int value, int offset) Q_ASSERT(value == m_state.changedRegisterIndex()); const QQmlJSRegisterContent iteratorContent = m_state.accumulatorIn(); - const QQmlJSScope::ConstPtr iteratorType = iteratorContent.storedType(); + if (!iteratorContent.isProperty()) { + reject(u"using non-iterator as iterator"_s); + return; + } + const QQmlJSScope::ConstPtr iteratorType = iteratorContent.storedType(); const QString iteratorTypeName = iteratorType->internalName(); const QString listName = m_state.accumulatorVariableIn + u"List" + QString::number(iteratorContent.baseLookupIndex()); diff --git a/tests/auto/qml/qmlcppcodegen/data/failures.qml b/tests/auto/qml/qmlcppcodegen/data/failures.qml index 2dfa751780..e776e849b9 100644 --- a/tests/auto/qml/qmlcppcodegen/data/failures.qml +++ b/tests/auto/qml/qmlcppcodegen/data/failures.qml @@ -92,4 +92,11 @@ QtObject { // Cannot generate code for getters property rect r3: ({ get x() { return 42; }, y: 4 }) + + property int nonIterable: { + var result = 1; + for (var a in Component) + ++result; + return result; + } }