Add weakRef guard to detect ScriptEngine deletion during ScriptCache::getScriptContents

This commit is contained in:
humbletim 2017-02-27 22:58:59 -05:00
parent 5b11c0e00a
commit 654c72fb7e
2 changed files with 8 additions and 2 deletions

View file

@ -1620,8 +1620,14 @@ void ScriptEngine::loadEntityScript(const EntityItemID& entityID, const QString&
setEntityScriptDetails(entityID, newDetails);
auto scriptCache = DependencyManager::get<ScriptCache>();
// note: see EntityTreeRenderer.cpp for shared pointer lifecycle management
QWeakPointer<ScriptEngine> 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";

View file

@ -78,7 +78,7 @@ public:
QUrl definingSandboxURL { QUrl("about:EntityScript") };
};
class ScriptEngine : public BaseScriptEngine, public EntitiesScriptEngineProvider {
class ScriptEngine : public BaseScriptEngine, public EntitiesScriptEngineProvider, public QEnableSharedFromThis<ScriptEngine> {
Q_OBJECT
Q_PROPERTY(QString context READ getContext)
public: