aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2026-04-27 19:20:02 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2026-04-28 22:48:42 +0000
commit7416a4ca2d1fad2edb3fb8c1d1077505e2f7b729 (patch)
treef6e2d831a547e756703637a82ec7be8b9507db07
parent97a3d95281366b72b776f361898ec6da7a26531c (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.cpp2
-rw-r--r--src/qml/compiler/qv4codegen.cpp2
-rw-r--r--src/qml/compiler/qv4compiler.cpp8
-rw-r--r--src/qml/jit/qv4assemblercommon.cpp2
-rw-r--r--src/qml/jsapi/qjsengine.cpp3
-rw-r--r--src/qml/jsruntime/qv4executablecompilationunit.cpp3
-rw-r--r--src/qml/jsruntime/qv4identifiertable.cpp2
-rw-r--r--src/qml/jsruntime/qv4identifiertable_p.h2
-rw-r--r--src/qml/jsruntime/qv4urlobject.cpp4
-rw-r--r--src/qml/jsruntime/qv4urlobject_p.h2
-rw-r--r--src/qml/qml/qqml.cpp5
-rw-r--r--src/qml/qml/qqmlcomponentandaliasresolver_p.h2
-rw-r--r--src/qml/qml/qqmlmetatype.cpp6
-rw-r--r--src/qml/qml/qqmlmetatypedata.cpp3
-rw-r--r--src/qml/qml/qqmlobjectcreator.cpp2
-rw-r--r--src/qml/qml/qqmlpluginimporter.cpp4
-rw-r--r--src/qml/qml/qqmltypecompiler_p.h2
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> &params)
{
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> &params);
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;
}