diff options
author | Fabian Kosmale <fabian.kosmale@qt.io> | 2023-12-15 16:39:45 +0100 |
---|---|---|
committer | Fabian Kosmale <fabian.kosmale@qt.io> | 2023-12-19 15:39:18 +0100 |
commit | 4d7ce35bd2b3a7319973303f163c26cdf67c73f6 (patch) | |
tree | 25cb9c5da99ba81ad9972a2984aef21cb63b2928 /src/qml/jsapi | |
parent | af27f1ce3bf737f1b3e3d0413f1ff02cc5e32790 (diff) |
QJSValue: convert more aggressively to QVariant
Normally, we don't want to convert aggressively between JS objects and
QVariant, as that is prone to losing information. However,
QJSValue::toVariant is documented to attempt lossy conversions. Restore
the behavior of Qt < 6.5.3 for it. This is done by replacing the boolean
indicating we should wrap JS objects into QJSValue with an enum instead.
That enum introduces a third state ("Aggressive"), which is only used
for QJSValue::toVariant. All other users of QJSEngine::toVariant behave
as before (post 6.5.3).
Function objects are still not converted, as we know that this would be
a futile attempt, and more importantly, to keep the behavior that
existed before Qt 6.5.3.
Amends 43077556550c6b17226a7d393ec844b605c9c678 which introduced the
regression and afe96c4d633146df477012975824b8ab65034239 which fixed the
issue only partially.
Pick-to: 6.5 6.6 6.7
Fixes: QTBUG-119963
Change-Id: I07d9901437812579ac5b873a4dff4de60c8f617e
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Diffstat (limited to 'src/qml/jsapi')
-rw-r--r-- | src/qml/jsapi/qjsvalue.cpp | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/src/qml/jsapi/qjsvalue.cpp b/src/qml/jsapi/qjsvalue.cpp index bc75526e8d..f622c3fb23 100644 --- a/src/qml/jsapi/qjsvalue.cpp +++ b/src/qml/jsapi/qjsvalue.cpp @@ -638,8 +638,11 @@ QVariant QJSValue::toVariant(QJSValue::ObjectConversionBehavior behavior) const if (val.isString()) return QVariant(val.toQString()); if (val.as<QV4::Managed>()) { - return QV4::ExecutionEngine::toVariant( - val, /*typeHint*/ QMetaType{}, behavior == RetainJSObjects); + if (behavior == RetainJSObjects) + return QV4::ExecutionEngine::toVariant( + val, /*typeHint*/ QMetaType{}, /*createJSValueForObjectsAndSymbols=*/ true); + else + return QV4::ExecutionEngine::toVariantLossy(val); } Q_ASSERT(false); |