diff options
| author | Ulf Hermann <ulf.hermann@qt.io> | 2023-06-14 10:54:50 +0200 |
|---|---|---|
| committer | Ulf Hermann <ulf.hermann@qt.io> | 2023-06-15 11:57:32 +0000 |
| commit | a2104034d404179f5fad98fd54a133b288ded47d (patch) | |
| tree | 7efcd2510ce8481a0e14ac6a665c0f384889ad61 /src/qml/jsruntime/qv4engine.cpp | |
| parent | 0c50edd6f5a819a7bc6e19c5ac69191d491167da (diff) | |
QML: Try QML conversion before metatype conversion
and guard against null gadgetPtr. This is what we get for uninitialized
value type properties.
Pick-to: 6.5 6.5.2 6.6
Fixes: QTBUG-114494
Change-Id: I86ad23abcc4fec219017d1aad6b7add1c9a9af5d
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml/jsruntime/qv4engine.cpp')
| -rw-r--r-- | src/qml/jsruntime/qv4engine.cpp | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp index e34c22b8e2..77664c00c6 100644 --- a/src/qml/jsruntime/qv4engine.cpp +++ b/src/qml/jsruntime/qv4engine.cpp @@ -2662,8 +2662,23 @@ bool ExecutionEngine::metaTypeFromJS(const Value &value, QMetaType metaType, voi const QMetaType valueType = vtw->type(); if (valueType == metaType) return vtw->toGadget(data); - if (QMetaType::canConvert(valueType, metaType)) - return QMetaType::convert(valueType, vtw->d()->gadgetPtr(), metaType, data); + + Heap::QQmlValueTypeWrapper *d = vtw->d(); + if (d->isReference()) + d->readReference(); + + if (void *gadgetPtr = d->gadgetPtr()) { + if (QQmlValueTypeProvider::createValueType(metaType, data, valueType, gadgetPtr)) + return true; + if (QMetaType::canConvert(valueType, metaType)) + return QMetaType::convert(valueType, gadgetPtr, metaType, data); + } else { + QVariant empty(valueType); + if (QQmlValueTypeProvider::createValueType(metaType, data, valueType, empty.data())) + return true; + if (QMetaType::canConvert(valueType, metaType)) + return QMetaType::convert(valueType, empty.data(), metaType, data); + } } // Try to use magic; for compatibility with qjsvalue_cast. @@ -2676,7 +2691,7 @@ bool ExecutionEngine::metaTypeFromJS(const Value &value, QMetaType metaType, voi if (variantObject) { // Actually a reference, because we're poking it for its data() below and we want // the _original_ data, not some copy. - const QVariant &var = variantObject->d()->data(); + QVariant &var = variantObject->d()->data(); if (var.metaType() == metaType) { metaType.destruct(data); @@ -2725,7 +2740,8 @@ bool ExecutionEngine::metaTypeFromJS(const Value &value, QMetaType metaType, voi proto = proto->getPrototypeOf(); } } - } else if (QQmlValueTypeProvider::createValueType(metaType, data, var)) { + } else if (QQmlValueTypeProvider::createValueType( + metaType, data, var.metaType(), var.data())) { return true; } } else if (value.isNull() && isPointer) { |
