diff options
Diffstat (limited to 'src/qml/jsapi')
-rw-r--r-- | src/qml/jsapi/qjsengine.cpp | 1 | ||||
-rw-r--r-- | src/qml/jsapi/qjsvalue_p.h | 12 |
2 files changed, 11 insertions, 2 deletions
diff --git a/src/qml/jsapi/qjsengine.cpp b/src/qml/jsapi/qjsengine.cpp index 817fc15943..8f1496a8d4 100644 --- a/src/qml/jsapi/qjsengine.cpp +++ b/src/qml/jsapi/qjsengine.cpp @@ -369,6 +369,7 @@ QJSEngine::QJSEngine(QJSEnginePrivate &dd, QObject *parent) */ QJSEngine::~QJSEngine() { + m_v4Engine->inShutdown = true; QJSEnginePrivate::removeFromDebugServer(this); delete m_v4Engine; } diff --git a/src/qml/jsapi/qjsvalue_p.h b/src/qml/jsapi/qjsvalue_p.h index b95e76e76e..4624652c93 100644 --- a/src/qml/jsapi/qjsvalue_p.h +++ b/src/qml/jsapi/qjsvalue_p.h @@ -150,9 +150,17 @@ public: case QV4::StaticValue::Integer_Type: return encode(qv4Value.integerValue()); case QV4::StaticValue::Managed_Type: { - QV4::Value *m = qv4Value.as<QV4::Managed>()->engine() - ->memoryManager->m_persistentValues->allocate(); + auto managed = qv4Value.as<QV4::Managed>(); + auto engine = managed->engine(); + auto mm = engine->memoryManager; + QV4::Value *m = mm->m_persistentValues->allocate(); Q_ASSERT(m); + // we create a new strong reference to the heap managed object + // to avoid having to rescan the persistent values, we mark it here + QV4::WriteBarrier::markCustom(engine, [&](QV4::MarkStack *stack){ + if constexpr (QV4::WriteBarrier::isInsertionBarrier) + managed->heapObject()->mark(stack); + }); *m = qv4Value; return encodePointer(m, Kind::QV4ValuePtr); } |