From 654c72fb7e19c6ee6f5d46249220b5257c5bea9e Mon Sep 17 00:00:00 2001 From: humbletim Date: Mon, 27 Feb 2017 22:58:59 -0500 Subject: [PATCH] Add weakRef guard to detect ScriptEngine deletion during ScriptCache::getScriptContents --- libraries/script-engine/src/ScriptEngine.cpp | 8 +++++++- libraries/script-engine/src/ScriptEngine.h | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index d4b6d592c0..bbe2d90ba4 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -1620,8 +1620,14 @@ void ScriptEngine::loadEntityScript(const EntityItemID& entityID, const QString& setEntityScriptDetails(entityID, newDetails); auto scriptCache = DependencyManager::get(); + // note: see EntityTreeRenderer.cpp for shared pointer lifecycle management + QWeakPointer weakRef(sharedFromThis()); scriptCache->getScriptContents(entityScript, - [this, entityScript, entityID](const QString& url, const QString& contents, bool isURL, bool success, const QString& status) { + [this, weakRef, entityScript, entityID](const QString& url, const QString& contents, bool isURL, bool success, const QString& status) { + if (!weakRef) { + qCWarning(scriptengine) << "loadEntityScript.contentAvailable -- ScriptEngine was deleted during getScriptContents!!"; + return; + } if (isStopping()) { #ifdef DEBUG_ENTITY_STATES qCDebug(scriptengine) << "loadEntityScript.contentAvailable -- stopping"; diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h index 7f533d2f40..b988ccfe90 100644 --- a/libraries/script-engine/src/ScriptEngine.h +++ b/libraries/script-engine/src/ScriptEngine.h @@ -78,7 +78,7 @@ public: QUrl definingSandboxURL { QUrl("about:EntityScript") }; }; -class ScriptEngine : public BaseScriptEngine, public EntitiesScriptEngineProvider { +class ScriptEngine : public BaseScriptEngine, public EntitiesScriptEngineProvider, public QEnableSharedFromThis { Q_OBJECT Q_PROPERTY(QString context READ getContext) public: