diff options
author | Alexandru Croitor <alexandru.croitor@qt.io> | 2019-07-11 14:51:40 +0200 |
---|---|---|
committer | Alexandru Croitor <alexandru.croitor@qt.io> | 2019-07-11 17:24:39 +0200 |
commit | 13374ceb165c44658aa97890c37b206859c9a31c (patch) | |
tree | 562362b196a459ee3449a5a1e60e5216a9dd6984 /src/qml/jsapi/qjsvalue_p.h | |
parent | ae47deba4c943c496412530a8d2a5a688ae12038 (diff) | |
parent | b5d18be5a03406d0aac83856dd41e1525fd14a28 (diff) |
Merge remote-tracking branch 'origin/wip/qt6' into wip/cmake
Change-Id: I2963c1209316fb6755f572969f368970450d7991
Diffstat (limited to 'src/qml/jsapi/qjsvalue_p.h')
-rw-r--r-- | src/qml/jsapi/qjsvalue_p.h | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/src/qml/jsapi/qjsvalue_p.h b/src/qml/jsapi/qjsvalue_p.h index bcf0a9d12d..2faffffbae 100644 --- a/src/qml/jsapi/qjsvalue_p.h +++ b/src/qml/jsapi/qjsvalue_p.h @@ -60,6 +60,8 @@ #include <private/qv4mm_p.h> #include <private/qv4persistent_p.h> +#include <QtCore/qthread.h> + QT_BEGIN_NAMESPACE class Q_AUTOTEST_EXPORT QJSValuePrivate @@ -79,6 +81,11 @@ public: return nullptr; } + static inline void setRawValue(QJSValue *jsval, QV4::Value *v) + { + jsval->d = reinterpret_cast<quintptr>(v); + } + static inline void setVariant(QJSValue *jsval, const QVariant &v) { QVariant *val = new QVariant(v); jsval->d = reinterpret_cast<quintptr>(val) | 1; @@ -169,10 +176,20 @@ public: } static inline void free(QJSValue *jsval) { - if (QV4::Value *v = QJSValuePrivate::getValue(jsval)) + if (QV4::Value *v = QJSValuePrivate::getValue(jsval)) { + if (QV4::ExecutionEngine *e = engine(jsval)) { + if (QJSEngine *jsEngine = e->jsEngine()) { + if (jsEngine->thread() != QThread::currentThread()) { + QMetaObject::invokeMethod( + jsEngine, [v](){ QV4::PersistentValueStorage::free(v); }); + return; + } + } + } QV4::PersistentValueStorage::free(v); - else if (QVariant *v = QJSValuePrivate::getVariant(jsval)) + } else if (QVariant *v = QJSValuePrivate::getVariant(jsval)) { delete v; + } } }; |