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 {