diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2020-12-11 13:35:53 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2020-12-18 17:26:51 +0100 |
commit | 6f181768a3147bbfa9a33cf2c05453365693f5b9 (patch) | |
tree | 3ff80238b5784032c86cfc1a70088e17b62a7127 /src/qml/jsapi/qjsengine.h | |
parent | d5ac54da624dbaebc865c8243a5e1c33d5e1c7ba (diff) |
Add a QJSManagedValue
A QJSManagedValue is a view on a QJSValue which always knows the engine
the value belongs to. This allows us to implement the JavaScript
semantics of the various QJSValue methods in a much more rigorous way.
[ChangeLog][QtQml] The new QJSManagedValue should be used instead of
QJSValue for manipulating properties and prototypes of JavaScript
values, as well as for calling JavaScript functions.
Change-Id: I9d445ffcf68dfa72dba9bae0818e83c80665ad66
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml/jsapi/qjsengine.h')
-rw-r--r-- | src/qml/jsapi/qjsengine.h | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/src/qml/jsapi/qjsengine.h b/src/qml/jsapi/qjsengine.h index c480a77599..9b02469b23 100644 --- a/src/qml/jsapi/qjsengine.h +++ b/src/qml/jsapi/qjsengine.h @@ -46,7 +46,7 @@ #include <QtCore/qsharedpointer.h> #include <QtCore/qobject.h> #include <QtQml/qjsvalue.h> - +#include <QtQml/qjsmanagedvalue.h> #include <QtQml/qqmldebug.h> QT_BEGIN_NAMESPACE @@ -92,12 +92,25 @@ public: { return create(qMetaTypeId<T>(), &value); } + + template <typename T> + inline QJSManagedValue toManagedValue(const T &value) + { + return createManaged(QMetaType::fromType<T>(), &value); + } + template <typename T> inline T fromScriptValue(const QJSValue &value) { return qjsvalue_cast<T>(value); } + template <typename T> + inline T fromManagedValue(const QJSManagedValue &value) + { + return qjsvalue_cast<T>(value); + } + void collectGarbage(); enum ObjectOwnership { CppOwnership, JavaScriptOwnership }; @@ -131,13 +144,18 @@ Q_SIGNALS: void uiLanguageChanged(); private: + QJSManagedValue createManaged(QMetaType type, const void *ptr); QJSValue create(int type, const void *ptr); + static bool convertManaged(const QJSManagedValue &value, int type, void *ptr); static bool convertV2(const QJSValue &value, int type, void *ptr); template<typename T> friend inline T qjsvalue_cast(const QJSValue &); + template<typename T> + friend inline T qjsvalue_cast(const QJSManagedValue &); + protected: QJSEngine(QJSEnginePrivate &dd, QObject *parent = nullptr); @@ -163,12 +181,30 @@ T qjsvalue_cast(const QJSValue &value) return T(); } +template<typename T> +T qjsvalue_cast(const QJSManagedValue &value) +{ + { + T t; + if (QJSEngine::convertManaged(value, qMetaTypeId<T>(), &t)) + return t; + } + + return qvariant_cast<T>(value.toVariant()); +} + template <> inline QVariant qjsvalue_cast<QVariant>(const QJSValue &value) { return value.toVariant(); } +template <> +inline QVariant qjsvalue_cast<QVariant>(const QJSManagedValue &value) +{ + return value.toVariant(); +} + Q_QML_EXPORT QJSEngine *qjsEngine(const QObject *); QT_END_NAMESPACE |