diff options
| author | Ulf Hermann <ulf.hermann@qt.io> | 2025-09-03 13:47:48 +0200 |
|---|---|---|
| committer | Ulf Hermann <ulf.hermann@qt.io> | 2025-09-11 14:01:55 +0200 |
| commit | ce266fbcddc48edd63c4ba8c4a6f43fb2df48153 (patch) | |
| tree | 780c112575bff245646753258fee3e50375db68b /src/qml/jsruntime/qv4engine.cpp | |
| parent | 398411caaf6e0713ff10daadf14531e02708aa4a (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.cpp | 20 |
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; } |
