diff options
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; } |
