aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4engine.cpp
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2023-05-08 14:57:34 +0200
committerUlf Hermann <ulf.hermann@qt.io>2023-05-09 21:28:06 +0200
commit1b89c1edcae68351632c2755e5408410c2ff98e3 (patch)
treed55b4b9b563cf65e47ba00f154d406d2877d6590 /src/qml/jsruntime/qv4engine.cpp
parent43077556550c6b17226a7d393ec844b605c9c678 (diff)
QML: Allow conversion from QV4::Sequence to different iterable
Pick-to: 6.5 Fixes: QTBUG-112291 Change-Id: Idd47ea8daf9c54759af6c1feba68bd52d1163615 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml/jsruntime/qv4engine.cpp')
-rw-r--r--src/qml/jsruntime/qv4engine.cpp32
1 files changed, 21 insertions, 11 deletions
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp
index efde8c3977..d1ddde7089 100644
--- a/src/qml/jsruntime/qv4engine.cpp
+++ b/src/qml/jsruntime/qv4engine.cpp
@@ -2444,6 +2444,23 @@ void ExecutionEngine::setExtensionData(int index, Deletable *data)
m_extensionData[index] = data;
}
+template<typename Source>
+bool convertToIterable(QMetaType metaType, void *data, Source *sequence)
+{
+ QSequentialIterable iterable;
+ if (!QMetaType::view(metaType, data, QMetaType::fromType<QSequentialIterable>(), &iterable))
+ return false;
+
+ const QMetaType elementMetaType = iterable.valueMetaType();
+ QVariant element(elementMetaType);
+ for (qsizetype i = 0, end = sequence->getLength(); i < end; ++i) {
+ if (!ExecutionEngine::metaTypeFromJS(sequence->get(i), elementMetaType, element.data()))
+ element = QVariant(elementMetaType);
+ iterable.addValue(element, QSequentialIterable::AtEnd);
+ }
+ return true;
+}
+
// Converts a JS value to a meta-type.
// data must point to a place that can store a value of the given type.
// Returns true if conversion succeeded, false otherwise.
@@ -2711,21 +2728,14 @@ bool ExecutionEngine::metaTypeFromJS(const Value &value, QMetaType metaType, voi
metaType.construct(data, result.constData());
return true;
}
+
+ if (convertToIterable(metaType, data, sequence))
+ return true;
}
if (const QV4::ArrayObject *array = value.as<ArrayObject>()) {
- QSequentialIterable iterable;
- if (QMetaType::view(
- metaType, data, QMetaType::fromType<QSequentialIterable>(), &iterable)) {
- const QMetaType elementMetaType = iterable.valueMetaType();
- QVariant element(elementMetaType);
- for (qsizetype i = 0, end = array->getLength(); i < end; ++i) {
- if (!metaTypeFromJS(array->get(i), elementMetaType, element.data()))
- element = QVariant(elementMetaType);
- iterable.addValue(element, QSequentialIterable::AtEnd);
- }
+ if (convertToIterable(metaType, data, array))
return true;
- }
}
return false;