diff options
| author | Ulf Hermann <ulf.hermann@qt.io> | 2026-04-27 19:20:02 +0200 |
|---|---|---|
| committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2026-04-28 22:48:42 +0000 |
| commit | 7416a4ca2d1fad2edb3fb8c1d1077505e2f7b729 (patch) | |
| tree | f6e2d831a547e756703637a82ec7be8b9507db07 | |
| parent | 97a3d95281366b72b776f361898ec6da7a26531c (diff) | |
QtQml: Avoid detaching iteration on Qt containers
Pick-to: 6.8
Task-number: QTBUG-146040
Axivion-Id: qt_Essentials_qtqml_dev_linux:SV994
Axivion-Id: qt_Essentials_qtqml_dev_linux:SV995
Axivion-Id: qt_Essentials_qtqml_dev_linux:SV996
Axivion-Id: qt_Essentials_qtqml_dev_linux:SV997
Axivion-Id: qt_Essentials_qtqml_dev_linux:SV998
Axivion-Id: qt_Essentials_qtqml_dev_linux:SV999
Axivion-Id: qt_Essentials_qtqml_dev_linux:SV1000
Axivion-Id: qt_Essentials_qtqml_dev_linux:SV1001
Axivion-Id: qt_Essentials_qtqml_dev_linux:SV1003
Axivion-Id: qt_Essentials_qtqml_dev_linux:SV1004
Axivion-Id: qt_Essentials_qtqml_dev_linux:SV1005
Axivion-Id: qt_Essentials_qtqml_dev_linux:SV1006
Axivion-Id: qt_Essentials_qtqml_dev_linux:SV1007
Axivion-Id: qt_Essentials_qtqml_dev_linux:SV1009
Axivion-Id: qt_Essentials_qtqml_dev_linux:SV1011
Axivion-Id: qt_Essentials_qtqml_dev_linux:SV1012
Axivion-Id: qt_Essentials_qtqml_dev_linux:SV1013
Axivion-Id: qt_Essentials_qtqml_dev_linux:SV1014
Axivion-Id: qt_Essentials_qtqml_dev_linux:SV1015
Axivion-Id: qt_Essentials_qtqml_dev_linux:SV1016
Axivion-Id: qt_Essentials_qtqml_dev_linux:SV1019
Change-Id: Ie792b0bf76cc30cf70b948378de3752adc95c4f8
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
(cherry picked from commit c51e5c1b5cab2690db0493a9b54870bab37cfee6)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
| -rw-r--r-- | src/qml/compiler/qqmlirbuilder.cpp | 2 | ||||
| -rw-r--r-- | src/qml/compiler/qv4codegen.cpp | 2 | ||||
| -rw-r--r-- | src/qml/compiler/qv4compiler.cpp | 8 | ||||
| -rw-r--r-- | src/qml/jit/qv4assemblercommon.cpp | 2 | ||||
| -rw-r--r-- | src/qml/jsapi/qjsengine.cpp | 3 | ||||
| -rw-r--r-- | src/qml/jsruntime/qv4executablecompilationunit.cpp | 3 | ||||
| -rw-r--r-- | src/qml/jsruntime/qv4identifiertable.cpp | 2 | ||||
| -rw-r--r-- | src/qml/jsruntime/qv4identifiertable_p.h | 2 | ||||
| -rw-r--r-- | src/qml/jsruntime/qv4urlobject.cpp | 4 | ||||
| -rw-r--r-- | src/qml/jsruntime/qv4urlobject_p.h | 2 | ||||
| -rw-r--r-- | src/qml/qml/qqml.cpp | 5 | ||||
| -rw-r--r-- | src/qml/qml/qqmlcomponentandaliasresolver_p.h | 2 | ||||
| -rw-r--r-- | src/qml/qml/qqmlmetatype.cpp | 6 | ||||
| -rw-r--r-- | src/qml/qml/qqmlmetatypedata.cpp | 3 | ||||
| -rw-r--r-- | src/qml/qml/qqmlobjectcreator.cpp | 2 | ||||
| -rw-r--r-- | src/qml/qml/qqmlpluginimporter.cpp | 4 | ||||
| -rw-r--r-- | src/qml/qml/qqmltypecompiler_p.h | 2 |
17 files changed, 30 insertions, 24 deletions
diff --git a/src/qml/compiler/qqmlirbuilder.cpp b/src/qml/compiler/qqmlirbuilder.cpp index 89baf97ee9..b7a10ddd26 100644 --- a/src/qml/compiler/qqmlirbuilder.cpp +++ b/src/qml/compiler/qqmlirbuilder.cpp @@ -852,7 +852,7 @@ private: Q_UNREACHABLE_RETURN(nullptr); } - static bool isUnique(IRBuilder *builder) + static bool isUnique(const IRBuilder *builder) { for (const Pragma *prev : builder->_pragmas) { if (prev->type == type()) diff --git a/src/qml/compiler/qv4codegen.cpp b/src/qml/compiler/qv4codegen.cpp index f897b80684..18c8138e2a 100644 --- a/src/qml/compiler/qv4codegen.cpp +++ b/src/qml/compiler/qv4codegen.cpp @@ -229,7 +229,7 @@ void Codegen::generateFromModule(const QString &sourceCode, ESModule *node, Modu { Compiler::Context *moduleContext = _module->contextMap.value(node); - for (const auto &entry: moduleContext->exportEntries) { + for (const auto &entry: std::as_const(moduleContext->exportEntries)) { if (entry.moduleRequest.isEmpty()) { // ### check against imported bound names _module->localExportEntries << entry; diff --git a/src/qml/compiler/qv4compiler.cpp b/src/qml/compiler/qv4compiler.cpp index 9470cb87a4..a2c14e0507 100644 --- a/src/qml/compiler/qv4compiler.cpp +++ b/src/qml/compiler/qv4compiler.cpp @@ -293,13 +293,13 @@ QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit(GeneratorO std::for_each(module->starExportEntries.constBegin(), module->starExportEntries.constEnd(), registerExportEntry); } { - for (const auto &entry: module->importEntries) { + for (const auto &entry: std::as_const(module->importEntries)) { registerString(entry.moduleRequest); registerString(entry.importName); registerString(entry.localName); } - for (const QString &request: module->moduleRequests) + for (const QString &request: std::as_const(module->moduleRequests)) registerString(request); } @@ -398,7 +398,7 @@ QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit(GeneratorO { CompiledData::ImportEntry *entryToWrite = reinterpret_cast<CompiledData::ImportEntry *>(dataPtr + unit->offsetToImportEntryTable); - for (const Compiler::ImportEntry &entry: module->importEntries) { + for (const Compiler::ImportEntry &entry: std::as_const(module->importEntries)) { entryToWrite->moduleRequest = getStringId(entry.moduleRequest); entryToWrite->importName = getStringId(entry.importName); entryToWrite->localName = getStringId(entry.localName); @@ -409,7 +409,7 @@ QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit(GeneratorO { quint32_le *moduleRequestEntryToWrite = reinterpret_cast<quint32_le *>(dataPtr + unit->offsetToModuleRequestTable); - for (const QString &moduleRequest: module->moduleRequests) { + for (const QString &moduleRequest: std::as_const(module->moduleRequests)) { *moduleRequestEntryToWrite = getStringId(moduleRequest); moduleRequestEntryToWrite++; } diff --git a/src/qml/jit/qv4assemblercommon.cpp b/src/qml/jit/qv4assemblercommon.cpp index 6cfbe34444..181e08f587 100644 --- a/src/qml/jit/qv4assemblercommon.cpp +++ b/src/qml/jit/qv4assemblercommon.cpp @@ -94,7 +94,7 @@ static void printDisassembledOutputWithCalls(QByteArray processedOutput, } } - auto lines = processedOutput.split('\n'); + const auto lines = processedOutput.split('\n'); for (const auto &line : lines) qCDebug(lcAsm, "%s", line.constData()); } diff --git a/src/qml/jsapi/qjsengine.cpp b/src/qml/jsapi/qjsengine.cpp index 7ef4657641..350cc634d7 100644 --- a/src/qml/jsapi/qjsengine.cpp +++ b/src/qml/jsapi/qjsengine.cpp @@ -538,13 +538,14 @@ QJSValue QJSEngine::evaluate(const QString& program, const QString& fileName, in QV4::StackTrace trace; result = v4->catchException(&trace); if (exceptionStackTrace) { - for (auto &&frame: trace) + for (auto &&frame: std::as_const(trace)) { exceptionStackTrace->push_back(QLatin1StringView("%1:%2:%3:%4").arg( frame.function, QString::number(qAbs(frame.line)), QString::number(frame.column), frame.source) ); + } } } if (v4->isInterrupted.loadRelaxed()) diff --git a/src/qml/jsruntime/qv4executablecompilationunit.cpp b/src/qml/jsruntime/qv4executablecompilationunit.cpp index 069ce097eb..6b512d3eda 100644 --- a/src/qml/jsruntime/qv4executablecompilationunit.cpp +++ b/src/qml/jsruntime/qv4executablecompilationunit.cpp @@ -413,9 +413,10 @@ const Value *ExecutableCompilationUnit::resolveExportRecursively( if (!module()) return nullptr; - for (const auto &entry: *resolveSet) + for (const auto &entry: std::as_const(*resolveSet)) { if (entry.module == this && entry.exportName->isEqualTo(exportName)) return nullptr; + } (*resolveSet) << ResolveSetEntry(this, exportName); diff --git a/src/qml/jsruntime/qv4identifiertable.cpp b/src/qml/jsruntime/qv4identifiertable.cpp index b4ffd070ee..9fadef61d3 100644 --- a/src/qml/jsruntime/qv4identifiertable.cpp +++ b/src/qml/jsruntime/qv4identifiertable.cpp @@ -210,7 +210,7 @@ Heap::Symbol *IdentifierTable::symbolForId(PropertyKey i) const return static_cast<Heap::Symbol *>(s); } -void IdentifierTable::markObjects(MarkStack *markStack) +void IdentifierTable::markObjects(MarkStack *markStack) const { for (const auto &h : idHashes) h->markObjects(markStack); diff --git a/src/qml/jsruntime/qv4identifiertable_p.h b/src/qml/jsruntime/qv4identifiertable_p.h index 5df18396e5..3eb237dc7c 100644 --- a/src/qml/jsruntime/qv4identifiertable_p.h +++ b/src/qml/jsruntime/qv4identifiertable_p.h @@ -65,7 +65,7 @@ public: Heap::String *stringForId(PropertyKey i) const; Heap::Symbol *symbolForId(PropertyKey i) const; - void markObjects(MarkStack *markStack); + void markObjects(MarkStack *markStack) const; void sweep(); void addIdentifierHash(IdentifierHashData *h) { diff --git a/src/qml/jsruntime/qv4urlobject.cpp b/src/qml/jsruntime/qv4urlobject.cpp index ba64d84fa5..4e929e59fa 100644 --- a/src/qml/jsruntime/qv4urlobject.cpp +++ b/src/qml/jsruntime/qv4urlobject.cpp @@ -810,7 +810,7 @@ void UrlSearchParamsObject::initializeParams(ScopedObject& params) } } -void UrlSearchParamsObject::setParams(QList<QStringList> params) +void UrlSearchParamsObject::setParams(const QList<QStringList> ¶ms) { auto *arrayObject = engine()->newArrayObject(0); auto *keys = engine()->newArrayObject(0); @@ -1082,7 +1082,7 @@ ReturnedValue UrlSearchParamsPrototype::method_toString( if (!checkSearchParamsType(v4, o)) return Encode::undefined(); - auto params = o->params(); + const auto params = o->params(); QString value; diff --git a/src/qml/jsruntime/qv4urlobject_p.h b/src/qml/jsruntime/qv4urlobject_p.h index b7af40b901..74c17eb167 100644 --- a/src/qml/jsruntime/qv4urlobject_p.h +++ b/src/qml/jsruntime/qv4urlobject_p.h @@ -267,7 +267,7 @@ struct UrlSearchParamsObject : Object void initializeParams(ScopedObject& params); QList<QStringList> params() const; - void setParams(QList<QStringList> params); + void setParams(const QList<QStringList> ¶ms); Heap::UrlObject *urlObject() const; void setUrlObject(const UrlObject *url); diff --git a/src/qml/qml/qqml.cpp b/src/qml/qml/qqml.cpp index 8b83e314a3..c57636e7ac 100644 --- a/src/qml/qml/qqml.cpp +++ b/src/qml/qml/qqml.cpp @@ -633,7 +633,10 @@ static void uniqueRevisions(QList<QTypeRevision> *revisions, QTypeRevision defau QTypeRevision added) { bool revisionsHaveMajorVersions = false; - for (QTypeRevision revision : QList<QTypeRevision>(*revisions)) { // yes, copy + + // copy because we modify revisions in the loop + const QList<QTypeRevision> origRevisions = *revisions; + for (QTypeRevision revision : origRevisions) { // allow any minor version for each explicitly specified past major one if (revision.hasMajorVersion()) { revisionsHaveMajorVersions = true; diff --git a/src/qml/qml/qqmlcomponentandaliasresolver_p.h b/src/qml/qml/qqmlcomponentandaliasresolver_p.h index 0dd623907f..fed44b5977 100644 --- a/src/qml/qml/qqmlcomponentandaliasresolver_p.h +++ b/src/qml/qml/qqmlcomponentandaliasresolver_p.h @@ -482,7 +482,7 @@ void QQmlComponentAndAliasResolver<ObjectContainer>::resolveGeneralizedGroupProp int componentIndex) { const auto &component = *m_compiler->objectAt(componentIndex); - for (CompiledBinding *binding : m_generalizedGroupProperties) + for (CompiledBinding *binding : std::as_const(m_generalizedGroupProperties)) resolveGeneralizedGroupProperty(component, binding); } diff --git a/src/qml/qml/qqmlmetatype.cpp b/src/qml/qml/qqmlmetatype.cpp index a751b5c75c..839768b6a3 100644 --- a/src/qml/qml/qqmlmetatype.cpp +++ b/src/qml/qml/qqmlmetatype.cpp @@ -1650,7 +1650,7 @@ static int doCountInternalCompositeTypeSelfReferences( }; doCheck(compilationUnit->metaType().iface()); - for (auto &&inlineData: compilationUnit->inlineComponentData) + for (const auto &inlineData : std::as_const(compilationUnit->inlineComponentData)) doCheck(inlineData.qmlType.typeId().iface()); return result; @@ -2059,7 +2059,7 @@ void QQmlMetaType::registerInternalCompositeType( }; doInsert(compilationUnit->metaType().iface()); - for (auto &&inlineData: compilationUnit->inlineComponentData) + for (const auto &inlineData : std::as_const(compilationUnit->inlineComponentData)) doInsert(inlineData.qmlType.typeId().iface()); } @@ -2083,7 +2083,7 @@ void QQmlMetaType::unregisterInternalCompositeType( }; doRemove(compilationUnit->metaType().iface()); - for (auto &&inlineData: compilationUnit->inlineComponentData) + for (const auto &inlineData : std::as_const(compilationUnit->inlineComponentData)) doRemove(inlineData.qmlType.typeId().iface()); } diff --git a/src/qml/qml/qqmlmetatypedata.cpp b/src/qml/qml/qqmlmetatypedata.cpp index 623398bbe9..e72a3a9719 100644 --- a/src/qml/qml/qqmlmetatypedata.cpp +++ b/src/qml/qml/qqmlmetatypedata.cpp @@ -240,9 +240,10 @@ QQmlPropertyCache::ConstPtr QQmlMetaTypeData::propertyCacheForPotentialInlineCom QMetaType t, const QQmlMetaTypeData::CompositeTypes::const_iterator &iter) { if (t != (*iter)->metaType()) { // this is an inline component, and what we have in the iterator is currently the parent compilation unit - for (auto &&icDatum: (*iter)->inlineComponentData) + for (const auto &icDatum : std::as_const((*iter)->inlineComponentData)) { if (icDatum.qmlType.typeId() == t) return (*iter)->propertyCaches.at(icDatum.objectIndex); + } } return (*iter)->rootPropertyCache(); } diff --git a/src/qml/qml/qqmlobjectcreator.cpp b/src/qml/qml/qqmlobjectcreator.cpp index c0992f3f11..f4f51a30cc 100644 --- a/src/qml/qml/qqmlobjectcreator.cpp +++ b/src/qml/qml/qqmlobjectcreator.cpp @@ -1620,7 +1620,7 @@ bool QQmlObjectCreator::finalize(QQmlInstantiationInterrupt &interrupt) } } - for (QQmlFinalizerHook *hook: sharedState->finalizeHooks) { + for (QQmlFinalizerHook *hook: std::as_const(sharedState->finalizeHooks)) { hook->componentFinalized(); if (watcher.hasRecursed()) return false; diff --git a/src/qml/qml/qqmlpluginimporter.cpp b/src/qml/qml/qqmlpluginimporter.cpp index 3bf649714b..3c3190f03b 100644 --- a/src/qml/qml/qqmlpluginimporter.cpp +++ b/src/qml/qml/qqmlpluginimporter.cpp @@ -161,9 +161,9 @@ static QList<StaticPluginMapping> staticQmlPlugins() for (const auto &plugin : staticPlugins) { // Filter out static plugins which are not Qml plugins - for (const QJsonValueConstRef &pluginURI : tryExtractQmlPluginURIs(plugin)) { + const QJsonArray pluginURIs = tryExtractQmlPluginURIs(plugin); + for (const QJsonValueConstRef &pluginURI : pluginURIs) qmlPlugins.append({ plugin, pluginURI.toString() }); - } } return qmlPlugins; } diff --git a/src/qml/qml/qqmltypecompiler_p.h b/src/qml/qml/qqmltypecompiler_p.h index 546c6f185a..57aa292fe1 100644 --- a/src/qml/qml/qqmltypecompiler_p.h +++ b/src/qml/qml/qqmltypecompiler_p.h @@ -70,7 +70,7 @@ public: QV4::CompiledData::ResolvedTypeReferenceMap *resolvedTypes = nullptr; ListPropertyAssignBehavior listPropertyAssignBehavior() const { - for (const QmlIR::Pragma *pragma: document->pragmas) { + for (const QmlIR::Pragma *pragma : std::as_const(document->pragmas)) { if (pragma->type == QmlIR::Pragma::ListPropertyAssignBehavior) return pragma->listPropertyAssignBehavior; } |
