diff options
| author | Ulf Hermann <ulf.hermann@qt.io> | 2024-10-24 14:15:49 +0200 |
|---|---|---|
| committer | Ulf Hermann <ulf.hermann@qt.io> | 2024-10-31 11:49:55 +0100 |
| commit | d61c0ce1bbdee9a6b43d889c8663176111646ce4 (patch) | |
| tree | 919b908049c0c29be09366f2781ad45d059c7194 /src/qml/jsruntime/qv4engine.cpp | |
| parent | 373cf5eaeb3da7f8cb4e9fb83dc18aafef0c9373 (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.cpp | 18 |
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>()) { |
