aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4engine.cpp
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2025-09-03 13:47:48 +0200
committerUlf Hermann <ulf.hermann@qt.io>2025-09-11 14:01:55 +0200
commitce266fbcddc48edd63c4ba8c4a6f43fb2df48153 (patch)
tree780c112575bff245646753258fee3e50375db68b /src/qml/jsruntime/qv4engine.cpp
parent398411caaf6e0713ff10daadf14531e02708aa4a (diff)
QtQml: Avoid double-wrapping when converting to QVariantList
Amends commit 1b89c1edcae68351632c2755e5408410c2ff98e3 Fixes: QTBUG-139764 Pick-to: 6.10 6.9 6.8 Change-Id: I1488527a235d74fc0352c72b9bfb69589c2f3d93 Reviewed-by: Sami Shalayel <sami.shalayel@qt.io>
Diffstat (limited to 'src/qml/jsruntime/qv4engine.cpp')
-rw-r--r--src/qml/jsruntime/qv4engine.cpp20
1 files changed, 17 insertions, 3 deletions
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp
index 334148f79c..a2f6565c4a 100644
--- a/src/qml/jsruntime/qv4engine.cpp
+++ b/src/qml/jsruntime/qv4engine.cpp
@@ -2516,15 +2516,29 @@ bool convertToIterable(QMetaType metaType, void *data, Source *sequence)
if (!QMetaType::view(metaType, data, QMetaType::fromType<QSequentialIterable>(), &iterable))
return false;
- const QMetaType elementMetaType = iterable.valueMetaType();
+ // Clear the sequence before appending. There may be stale data in there.
+ metaType.destruct(data);
+ metaType.construct(data);
+
QV4::Scope scope(sequence->engine());
QV4::ScopedValue v(scope);
+
+ const QMetaType elementMetaType = iterable.valueMetaType();
+ QVariant element;
+ void *elementData = nullptr;
+ if (elementMetaType == QMetaType::fromType<QVariant>()) {
+ elementData = &element;
+ } else {
+ element = QVariant(elementMetaType);
+ elementData = element.data();
+ }
+
for (qsizetype i = 0, end = sequence->getLength(); i < end; ++i) {
- QVariant element(elementMetaType);
v = sequence->get(i);
- ExecutionEngine::metaTypeFromJS(v, elementMetaType, element.data());
+ ExecutionEngine::metaTypeFromJS(v, elementMetaType, elementData);
iterable.addValue(element, QSequentialIterable::AtEnd);
}
+
return true;
}