From 8e718262bd5ed3569ce795a1d825d30213db2d3e Mon Sep 17 00:00:00 2001 From: ksuprynowicz <ksuprynowicz@post.pl> Date: Wed, 1 Mar 2023 21:11:34 +0100 Subject: [PATCH] Fixed object containing UniquePersistent --- libraries/script-engine/src/ScriptManager.cpp | 2 +- .../src/v8/ScriptObjectV8Proxy.cpp | 22 +++++++++++++++++++ .../src/v8/ScriptObjectV8Proxy.h | 3 +++ .../src/v8/ScriptValueIteratorV8Wrapper.cpp | 10 +++++++++ .../src/v8/ScriptValueIteratorV8Wrapper.h | 1 + .../src/v8/ScriptValueV8Wrapper.cpp | 2 ++ 6 files changed, 39 insertions(+), 1 deletion(-) diff --git a/libraries/script-engine/src/ScriptManager.cpp b/libraries/script-engine/src/ScriptManager.cpp index eca73c8478..7833c683a3 100644 --- a/libraries/script-engine/src/ScriptManager.cpp +++ b/libraries/script-engine/src/ScriptManager.cpp @@ -906,7 +906,7 @@ void ScriptManager::run() { // TODO: Integrate this with signals/slots instead of reimplementing throttling for ScriptManager while (!_isFinished) { - qCDebug(scriptengine) << "In script event loop"; + //qCDebug(scriptengine) << "In script event loop"; auto beforeSleep = clock::now(); diff --git a/libraries/script-engine/src/v8/ScriptObjectV8Proxy.cpp b/libraries/script-engine/src/v8/ScriptObjectV8Proxy.cpp index a971903278..fb00c3c60b 100644 --- a/libraries/script-engine/src/v8/ScriptObjectV8Proxy.cpp +++ b/libraries/script-engine/src/v8/ScriptObjectV8Proxy.cpp @@ -203,6 +203,11 @@ QObject* ScriptObjectV8Proxy::unwrap(const V8ScriptValue& val) { } ScriptObjectV8Proxy::~ScriptObjectV8Proxy() { + auto isolate = _engine->getIsolate(); + v8::Locker locker(isolate); + v8::Isolate::Scope isolateScope(isolate); + v8::HandleScope handleScope(isolate); + _v8Object.Reset(); if(_object) qDebug(scriptengine) << "Deleting object proxy: " << name(); if (_ownsObject) { QObject* qobject = _object; @@ -664,6 +669,15 @@ ScriptVariantV8Proxy::ScriptVariantV8Proxy(ScriptEngineV8* engine, const QVarian _name = QString::fromLatin1(variant.typeName()); } +ScriptVariantV8Proxy::~ScriptVariantV8Proxy() { + auto isolate = _engine->getIsolate(); + v8::Locker locker(isolate); + v8::Isolate::Scope isolateScope(isolate); + v8::HandleScope handleScope(isolate); + _v8ObjectTemplate.Reset(); + _v8Object.Reset(); +} + V8ScriptValue ScriptVariantV8Proxy::newVariant(ScriptEngineV8* engine, const QVariant& variant, V8ScriptValue proto) { auto isolate = engine->getIsolate(); v8::Locker locker(isolate); @@ -1147,6 +1161,14 @@ void ScriptMethodV8Proxy::call(const v8::FunctionCallbackInfo<v8::Value>& argume return QVariant(); }*/ +ScriptSignalV8Proxy::~ScriptSignalV8Proxy() { + auto isolate = _engine->getIsolate(); + v8::Locker locker(isolate); + v8::Isolate::Scope isolateScope(isolate); + v8::HandleScope handleScope(isolate); + _v8Context.Reset(); +} + QString ScriptSignalV8Proxy::fullName() const { Q_ASSERT(_object); if (!_object) return ""; diff --git a/libraries/script-engine/src/v8/ScriptObjectV8Proxy.h b/libraries/script-engine/src/v8/ScriptObjectV8Proxy.h index c7e6f43d02..5da29c49ce 100644 --- a/libraries/script-engine/src/v8/ScriptObjectV8Proxy.h +++ b/libraries/script-engine/src/v8/ScriptObjectV8Proxy.h @@ -129,6 +129,7 @@ private: // storage class ScriptVariantV8Proxy final { public: // construction ScriptVariantV8Proxy(ScriptEngineV8* engine, const QVariant& variant, V8ScriptValue scriptProto, ScriptObjectV8Proxy* proto); + ~ScriptVariantV8Proxy(); static V8ScriptValue newVariant(ScriptEngineV8* engine, const QVariant& variant, V8ScriptValue proto); static ScriptVariantV8Proxy* unwrapProxy(const V8ScriptValue& val); @@ -232,6 +233,8 @@ public: // construction _v8Context.Reset(_engine->getIsolate(), _engine->getContext()); } + ~ScriptSignalV8Proxy(); + private: // implementation virtual int qt_metacall(QMetaObject::Call call, int id, void** arguments) override; int discoverMetaCallIdx(); diff --git a/libraries/script-engine/src/v8/ScriptValueIteratorV8Wrapper.cpp b/libraries/script-engine/src/v8/ScriptValueIteratorV8Wrapper.cpp index 9d0a279db6..0a8576d60c 100644 --- a/libraries/script-engine/src/v8/ScriptValueIteratorV8Wrapper.cpp +++ b/libraries/script-engine/src/v8/ScriptValueIteratorV8Wrapper.cpp @@ -31,6 +31,16 @@ V8ScriptValueIterator::V8ScriptValueIterator(ScriptEngineV8* engine, v8::Local<v _currentIndex = -1; } +V8ScriptValueIterator::~V8ScriptValueIterator() { + auto isolate = _engine->getIsolate(); + v8::Locker locker(isolate); + v8::Isolate::Scope isolateScope(isolate); + v8::HandleScope handleScope(isolate); + _propertyNames.Reset(); + _object.Reset(); + _context.Reset(); +} + bool V8ScriptValueIterator::hasNext() const { return _currentIndex < _length - 1; } diff --git a/libraries/script-engine/src/v8/ScriptValueIteratorV8Wrapper.h b/libraries/script-engine/src/v8/ScriptValueIteratorV8Wrapper.h index 05cf4d3934..673b9e084c 100644 --- a/libraries/script-engine/src/v8/ScriptValueIteratorV8Wrapper.h +++ b/libraries/script-engine/src/v8/ScriptValueIteratorV8Wrapper.h @@ -27,6 +27,7 @@ class V8ScriptValueIterator { public: V8ScriptValueIterator(ScriptEngineV8* engine, v8::Local<v8::Value> object); + ~V8ScriptValueIterator(); bool hasNext() const; QString name() const; void next(); diff --git a/libraries/script-engine/src/v8/ScriptValueV8Wrapper.cpp b/libraries/script-engine/src/v8/ScriptValueV8Wrapper.cpp index 1b964cd946..b3ec666914 100644 --- a/libraries/script-engine/src/v8/ScriptValueV8Wrapper.cpp +++ b/libraries/script-engine/src/v8/ScriptValueV8Wrapper.cpp @@ -70,6 +70,7 @@ V8ScriptValue ScriptValueV8Wrapper::fullUnwrap(ScriptEngineV8* engine, const Scr } ScriptValue ScriptValueV8Wrapper::call(const ScriptValue& thisObject, const ScriptValueList& args) { + Q_ASSERT(_engine == _value.getEngine()); auto isolate = _engine->getIsolate(); v8::Locker locker(isolate); v8::Isolate::Scope isolateScope(isolate); @@ -104,6 +105,7 @@ ScriptValue ScriptValueV8Wrapper::call(const ScriptValue& thisObject, const Scri qCDebug(scriptengine) << "Function call failed: \"" << _engine->formatErrorMessageFromTryCatch(tryCatch); } v8::Local<v8::Value> result; + Q_ASSERT(_engine == _value.getEngine()); if (maybeResult.ToLocal(&result)) { return ScriptValue(new ScriptValueV8Wrapper(_engine, V8ScriptValue(_engine, result))); } else {