aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsapi/qjsengine.h
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2020-12-11 13:35:53 +0100
committerUlf Hermann <ulf.hermann@qt.io>2020-12-18 17:26:51 +0100
commit6f181768a3147bbfa9a33cf2c05453365693f5b9 (patch)
tree3ff80238b5784032c86cfc1a70088e17b62a7127 /src/qml/jsapi/qjsengine.h
parentd5ac54da624dbaebc865c8243a5e1c33d5e1c7ba (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.h38
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