aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4engine.cpp
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2024-10-24 14:15:49 +0200
committerUlf Hermann <ulf.hermann@qt.io>2024-10-31 11:49:55 +0100
commitd61c0ce1bbdee9a6b43d889c8663176111646ce4 (patch)
tree919b908049c0c29be09366f2781ad45d059c7194 /src/qml/jsruntime/qv4engine.cpp
parent373cf5eaeb3da7f8cb4e9fb83dc18aafef0c9373 (diff)
QtQml: Support conversion to QJSValue when constructing value types
Anything can be converted to QJSValue, but QMetaType::convert cannot perform the conversion. Pick-to: 6.8 Fixes: QTBUG-130522 Change-Id: I5614db21a0fcc0afa4a605cbd28ea92788aa146d Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml/jsruntime/qv4engine.cpp')
-rw-r--r--src/qml/jsruntime/qv4engine.cpp18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp
index c471b3332e..0b6464f094 100644
--- a/src/qml/jsruntime/qv4engine.cpp
+++ b/src/qml/jsruntime/qv4engine.cpp
@@ -1660,7 +1660,8 @@ static QVariant toVariant(const QV4::Value &value, QMetaType metaType, JSToQVari
#endif
if (metaType.isValid() && !(metaType.flags() & QMetaType::PointerToQObject)) {
- const QVariant result = QQmlValueTypeProvider::createValueType(value, metaType);
+ const QVariant result
+ = QQmlValueTypeProvider::createValueType(value, metaType, scope.engine);
if (result.isValid())
return result;
}
@@ -2706,14 +2707,18 @@ bool ExecutionEngine::metaTypeFromJS(const Value &value, QMetaType metaType, voi
d->readReference();
if (void *gadgetPtr = d->gadgetPtr()) {
- if (QQmlValueTypeProvider::populateValueType(metaType, data, valueType, gadgetPtr))
+ if (QQmlValueTypeProvider::populateValueType(
+ metaType, data, valueType, gadgetPtr, vtw->engine())) {
return true;
+ }
if (QMetaType::canConvert(valueType, metaType))
return QMetaType::convert(valueType, gadgetPtr, metaType, data);
} else {
QVariant empty(valueType);
- if (QQmlValueTypeProvider::populateValueType(metaType, data, valueType, empty.data()))
+ if (QQmlValueTypeProvider::populateValueType(
+ metaType, data, valueType, empty.data(), vtw->engine())) {
return true;
+ }
if (QMetaType::canConvert(valueType, metaType))
return QMetaType::convert(valueType, empty.data(), metaType, data);
}
@@ -2779,7 +2784,7 @@ bool ExecutionEngine::metaTypeFromJS(const Value &value, QMetaType metaType, voi
}
}
} else if (QQmlValueTypeProvider::populateValueType(
- metaType, data, var.metaType(), var.data())) {
+ metaType, data, var.metaType(), var.data(), variantObject->engine())) {
return true;
}
} else if (value.isNull() && isPointer) {
@@ -2792,8 +2797,11 @@ bool ExecutionEngine::metaTypeFromJS(const Value &value, QMetaType metaType, voi
*reinterpret_cast<QJSPrimitiveValue *>(data) = createPrimitive(&value);
return true;
} else if (!isPointer) {
- if (QQmlValueTypeProvider::populateValueType(metaType, data, value))
+ const QV4::Managed *managed = value.as<QV4::Managed>();
+ if (QQmlValueTypeProvider::populateValueType(
+ metaType, data, value, managed ? managed->engine() : nullptr)) {
return true;
+ }
}
if (const QV4::Sequence *sequence = value.as<Sequence>()) {