History

Update ScriptEngine to store full running status off entity scripts

Ryan Huffman committed 9 years ago

Commit cbb55a01 parent 89d12423 files · +93 −42Browse files

Showing the changes to libraries/script-engine/src/ScriptEngine.cpp (1 of 3 files). Show all

Unified · Split

libraries/script-engine/src/ScriptEngine.cpp+44−7
@@ -1374,6 +1374,15 @@ void ScriptEngine::forwardHandlerCall(const EntityItemID& entityID, const QStrin · 1373 unmodified lines
13741374 }
13751375 }
13761376
1377+bool ScriptEngine::getEntityScriptDetails(const EntityItemID& entityID, EntityScriptDetails &details) const {
1378+ auto it = _entityScripts.constFind(entityID);
1379+ if (it == _entityScripts.constEnd()) {
1380+ return false;
1381+ }
1382+ details = it.value();
1383+ return true;
1384+}
1385+
13771386 // since all of these operations can be asynch we will always do the actual work in the response handler
13781387 // for the download
13791388 void ScriptEngine::loadEntityScript(QWeakPointer<ScriptEngine> theEngine, const EntityItemID& entityID, const QString& entityScript, bool forceRedownload) {
@@ -1421,11 +1430,24 @@ void ScriptEngine::entityScriptContentAvailable(const EntityItemID& entityID, co · 41 unmodified lines
14211430 bool isFileUrl = isURL && scriptOrURL.startsWith("file://");
14221431 auto fileName = isURL ? scriptOrURL : "EmbeddedEntityScript";
14231432
1433+ EntityScriptDetails newDetails;
1434+ newDetails.scriptText = isURL ? contents : scriptOrURL;
1435+
1436+ if (!success) {
1437+ newDetails.status = ERROR_LOADING_SCRIPT;
1438+ newDetails.errorInfo = "Failed to load script";
1439+ _entityScripts[entityID] = newDetails;
1440+ return;
1441+ }
1442+
14241443 QScriptProgram program(contents, fileName);
14251444 if (!hasCorrectSyntax(program, this)) {
14261445 if (!isFileUrl) {
14271446 scriptCache->addScriptToBadScriptList(scriptOrURL);
14281447 }
1448+ newDetails.status = ERROR_RUNNING_SCRIPT;
1449+ newDetails.errorInfo = "Bad syntax";
1450+ _entityScripts[entityID] = newDetails;
14291451 return; // done processing script
14301452 }
14311453
@@ -1451,6 +1473,10 @@ void ScriptEngine::entityScriptContentAvailable(const EntityItemID& entityID, co · 19 unmodified lines
14511473 testConstructor = sandbox.evaluate(program);
14521474 }
14531475 if (hadUncaughtExceptions(sandbox, program.fileName(), this)) {
1476+ newDetails.status = ERROR_RUNNING_SCRIPT;
1477+ newDetails.errorInfo = "Exception";
1478+ _entityScripts[entityID] = newDetails;
1479+
14541480 return;
14551481 }
14561482
@@ -1473,6 +1499,10 @@ void ScriptEngine::entityScriptContentAvailable(const EntityItemID& entityID, co · 16 unmodified lines
14731499 scriptCache->addScriptToBadScriptList(scriptOrURL);
14741500 }
14751501
1502+ newDetails.status = ERROR_RUNNING_SCRIPT;
1503+ newDetails.errorInfo = "Could not find constructor";
1504+ _entityScripts[entityID] = newDetails;
1505+
14761506 return; // done processing script
14771507 }
14781508
@@ -1489,8 +1519,11 @@ void ScriptEngine::entityScriptContentAvailable(const EntityItemID& entityID, co · 10 unmodified lines
14891519 };
14901520 doWithEnvironment(entityID, sandboxURL, initialization);
14911521
1492− EntityScriptDetails newDetails = { scriptOrURL, entityScriptObject, lastModified, sandboxURL };
1522+ newDetails.scriptObject = entityScriptObject;
1523+ newDetails.lastModified = lastModified;
1524+ newDetails.definingSandboxURL = sandboxURL;
14931525 _entityScripts[entityID] = newDetails;
1526+
14941527 if (isURL) {
14951528 setParentURL("");
14961529 }
@@ -1516,7 +1549,9 @@ void ScriptEngine::unloadEntityScript(const EntityItemID& entityID) { · 19 unmodified lines
15161549 #endif
15171550
15181551 if (_entityScripts.contains(entityID)) {
1519− callEntityScriptMethod(entityID, "unload");
1552+ if (_entityScripts[entityID].status == RUNNING) {
1553+ callEntityScriptMethod(entityID, "unload");
1554+ }
15201555 _entityScripts.remove(entityID);
15211556 stopAllTimersForEntityScript(entityID);
15221557 }
@@ -1535,7 +1570,9 @@ void ScriptEngine::unloadAllEntityScripts() { · 12 unmodified lines
15351570 qCDebug(scriptengine) << "ScriptEngine::unloadAllEntityScripts() called on correct thread [" << thread() << "]";
15361571 #endif
15371572 foreach(const EntityItemID& entityID, _entityScripts.keys()) {
1538− callEntityScriptMethod(entityID, "unload");
1573+ if (_entityScripts[entityID].status == RUNNING) {
1574+ callEntityScriptMethod(entityID, "unload");
1575+ }
15391576 }
15401577 _entityScripts.clear();
15411578
@@ -1574,7 +1611,7 @@ void ScriptEngine::refreshFileScript(const EntityItemID& entityID) { · 32 unmodified lines
15741611 QString scriptContents = QTextStream(&file).readAll();
15751612 this->unloadEntityScript(entityID);
15761613 this->entityScriptContentAvailable(entityID, details.scriptText, scriptContents, true, true);
1577− if (!_entityScripts.contains(entityID)) {
1614+ if (!_entityScripts.contains(entityID) || _entityScripts[entityID].status != RUNNING) {
15781615 scriptWarningMessage("Reload script " + details.scriptText + " failed");
15791616 } else {
15801617 details = _entityScripts[entityID];
@@ -1633,7 +1670,7 @@ void ScriptEngine::callEntityScriptMethod(const EntityItemID& entityID, const QS · 52 unmodified lines
16331670 #endif
16341671
16351672 refreshFileScript(entityID);
1636− if (_entityScripts.contains(entityID)) {
1673+ if (_entityScripts.contains(entityID) && _entityScripts[entityID].status == RUNNING) {
16371674 EntityScriptDetails details = _entityScripts[entityID];
16381675 QScriptValue entityScript = details.scriptObject; // previously loaded
16391676 if (entityScript.property(methodName).isFunction()) {
@@ -1665,7 +1702,7 @@ void ScriptEngine::callEntityScriptMethod(const EntityItemID& entityID, const QS · 25 unmodified lines
16651702 #endif
16661703
16671704 refreshFileScript(entityID);
1668− if (_entityScripts.contains(entityID)) {
1705+ if (_entityScripts.contains(entityID) && _entityScripts[entityID].status == RUNNING) {
16691706 EntityScriptDetails details = _entityScripts[entityID];
16701707 QScriptValue entityScript = details.scriptObject; // previously loaded
16711708 if (entityScript.property(methodName).isFunction()) {
@@ -1698,7 +1735,7 @@ void ScriptEngine::callEntityScriptMethod(const EntityItemID& entityID, const QS · 26 unmodified lines
16981735 #endif
16991736
17001737 refreshFileScript(entityID);
1701− if (_entityScripts.contains(entityID)) {
1738+ if (_entityScripts.contains(entityID) && _entityScripts[entityID].status == RUNNING) {
17021739 EntityScriptDetails details = _entityScripts[entityID];
17031740 QScriptValue entityScript = details.scriptObject; // previously loaded
17041741 if (entityScript.property(methodName).isFunction()) {