aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4engine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml/jsruntime/qv4engine.cpp')
-rw-r--r--src/qml/jsruntime/qv4engine.cpp18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp
index 96cbee7622..71b174f315 100644
--- a/src/qml/jsruntime/qv4engine.cpp
+++ b/src/qml/jsruntime/qv4engine.cpp
@@ -2622,6 +2622,9 @@ bool ExecutionEngine::metaTypeFromJS(const Value &value, QMetaType metaType, voi
} else if (metaType == QMetaType::fromType<QJSValue>()) {
QJSValuePrivate::setValue(reinterpret_cast<QJSValue*>(data), value.asReturnedValue());
return true;
+ } else if (metaType == QMetaType::fromType<QJSPrimitiveValue>()) {
+ *reinterpret_cast<QJSPrimitiveValue *>(data) = createPrimitive(&value);
+ return true;
} else if (!isPointer) {
if (QQmlValueTypeProvider::createValueType(value, metaType, data))
return true;
@@ -2636,6 +2639,21 @@ bool ExecutionEngine::metaTypeFromJS(const Value &value, QMetaType metaType, voi
}
}
+ 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);
+ }
+ return true;
+ }
+ }
+
return false;
}