diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index c9780aff4c..e995194608 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -6039,7 +6039,8 @@ void Application::reloadResourceCaches() { getEntities()->clear(); DependencyManager::get()->clearCache(); - DependencyManager::get()->clearCache(); + //It's already cleared in reloadAllScripts so I'm not sure this is necessary. + //DependencyManager::get()->clearCache(); // Clear all the resource caches DependencyManager::get()->clear(); diff --git a/libraries/script-engine/src/ScriptEngines.cpp b/libraries/script-engine/src/ScriptEngines.cpp index ee6e6ffc2f..aeb2cb9336 100644 --- a/libraries/script-engine/src/ScriptEngines.cpp +++ b/libraries/script-engine/src/ScriptEngines.cpp @@ -609,6 +609,7 @@ void ScriptEngines::onScriptFinished(const QString& rawScriptURL, ScriptManagerP } } + manager->waitTillDoneRunning(); removeScriptEngine(manager); if (removed && !_isReloading) { diff --git a/libraries/script-engine/src/ScriptManager.cpp b/libraries/script-engine/src/ScriptManager.cpp index a5a5e21b96..ce4572fd89 100644 --- a/libraries/script-engine/src/ScriptManager.cpp +++ b/libraries/script-engine/src/ScriptManager.cpp @@ -1032,6 +1032,7 @@ void ScriptManager::stop(bool marshal) { QMetaObject::invokeMethod(this, "stop"); return; } + if (!_isFinished) { _isFinished = true; emit runningStateChanged(); diff --git a/libraries/script-engine/src/ScriptValue.h b/libraries/script-engine/src/ScriptValue.h index d5a057e0ad..40334733bc 100644 --- a/libraries/script-engine/src/ScriptValue.h +++ b/libraries/script-engine/src/ScriptValue.h @@ -4,6 +4,7 @@ // // Created by Heather Anderson on 4/25/21. // Copyright 2021 Vircadia contributors. +// Copyright 2022 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -22,6 +23,7 @@ #include #include #include +#include class ScriptEngine; class ScriptValue; @@ -199,6 +201,11 @@ ScriptValue& ScriptValue::operator=(const ScriptValue& other) { ScriptValue ScriptValue::call(const ScriptValue& thisObject, const ScriptValueList& args) const { Q_ASSERT(_proxy != nullptr); + ScriptEnginePointer scriptEngine = _proxy->engine(); + if (scriptEngine == nullptr) { + qDebug() << "Call to deleted or non-existing script engine"; + return ScriptValue(); + } return _proxy->call(thisObject, args); }