History

merge from upstream

Seth Alves committed 9 years ago

Commit c317ba82 parents bbe3f11 42083a195 files · +1644 −403Browse files

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

Unified · Split

libraries/script-engine/src/ScriptEngine.cpp+70−15
@@ -148,25 +148,29 @@ static bool hasCorrectSyntax(const QScriptProgram& program, ScriptEngine* report · 147 unmodified lines
148148 return true;
149149 }
150150
151−static bool hadUncaughtExceptions(QScriptEngine& engine, const QString& fileName, ScriptEngine* reportingEngine) {
151+static bool hadUncaughtExceptions(QScriptEngine& engine, const QString& fileName, ScriptEngine* reportingEngine, QString* exceptionMessage = nullptr) {
152152 if (engine.hasUncaughtException()) {
153153 const auto backtrace = engine.uncaughtExceptionBacktrace();
154154 const auto exception = engine.uncaughtException().toString();
155155 const auto line = QString::number(engine.uncaughtExceptionLineNumber());
156156 engine.clearExceptions();
157157
158− auto message = QString(SCRIPT_EXCEPTION_FORMAT).arg(exception, fileName, line);
158+ QString message = QString(SCRIPT_EXCEPTION_FORMAT).arg(exception, fileName, line);
159159 if (!backtrace.empty()) {
160160 static const auto lineSeparator = "\n ";
161161 message += QString("\n[Backtrace]%1%2").arg(lineSeparator, backtrace.join(lineSeparator));
162162 }
163163 reportingEngine->scriptErrorMessage(qPrintable(message));
164+ if (exceptionMessage) {
165+ *exceptionMessage = message;
166+ }
164167 return true;
165168 }
166169 return false;
167170 }
168171
169−ScriptEngine::ScriptEngine(const QString& scriptContents, const QString& fileNameString) :
172+ScriptEngine::ScriptEngine(Context context, const QString& scriptContents, const QString& fileNameString) :
173+ _context(context),
170174 _scriptContents(scriptContents),
171175 _timerFunctionMap(),
172176 _fileNameString(fileNameString),
@@ -181,6 +185,22 @@ ScriptEngine::ScriptEngine(const QString& scriptContents, const QString& fileNam · 8 unmodified lines
181185 setProcessEventsInterval(MSECS_PER_SECOND);
182186 }
183187
188+QString ScriptEngine::getContext() const {
189+ switch (_context) {
190+ case CLIENT_SCRIPT:
191+ return "client";
192+ case ENTITY_CLIENT_SCRIPT:
193+ return "entity_client";
194+ case ENTITY_SERVER_SCRIPT:
195+ return "entity_server";
196+ case AGENT_SCRIPT:
197+ return "agent";
198+ default:
199+ return "unknown";
200+ }
201+ return "unknown";
202+}
203+
184204 ScriptEngine::~ScriptEngine() {
185205 scriptInfoMessage("Script Engine shutting down:" + getFilename());
186206
@@ -563,11 +583,7 @@ void ScriptEngine::init() { · 376 unmodified lines
563583 // constants
564584 globalObject().setProperty("TREE_SCALE", newVariant(QVariant(TREE_SCALE)));
565585
566− auto recordingInterface = DependencyManager::get<RecordingScriptingInterface>();
567− registerGlobalObject("Recording", recordingInterface.data());
568−
569586 registerGlobalObject("Tablet", DependencyManager::get<TabletScriptingInterface>().data());
570−
571587 registerGlobalObject("Assets", &_assetScriptingInterface);
572588 registerGlobalObject("Resources", DependencyManager::get<ResourceScriptingInterface>().data());
573589 }
@@ -1377,6 +1393,15 @@ void ScriptEngine::forwardHandlerCall(const EntityItemID& entityID, const QStrin · 803 unmodified lines
13771393 }
13781394 }
13791395
1396+bool ScriptEngine::getEntityScriptDetails(const EntityItemID& entityID, EntityScriptDetails &details) const {
1397+ auto it = _entityScripts.constFind(entityID);
1398+ if (it == _entityScripts.constEnd()) {
1399+ return false;
1400+ }
1401+ details = it.value();
1402+ return true;
1403+}
1404+
13801405 // since all of these operations can be asynch we will always do the actual work in the response handler
13811406 // for the download
13821407 void ScriptEngine::loadEntityScript(QWeakPointer<ScriptEngine> theEngine, const EntityItemID& entityID, const QString& entityScript, bool forceRedownload) {
@@ -1424,11 +1449,24 @@ void ScriptEngine::entityScriptContentAvailable(const EntityItemID& entityID, co · 41 unmodified lines
14241449 bool isFileUrl = isURL && scriptOrURL.startsWith("file://");
14251450 auto fileName = isURL ? scriptOrURL : "EmbeddedEntityScript";
14261451
1452+ EntityScriptDetails newDetails;
1453+ newDetails.scriptText = scriptOrURL;
1454+
1455+ if (!success) {
1456+ newDetails.status = ERROR_LOADING_SCRIPT;
1457+ newDetails.errorInfo = "Failed to load script";
1458+ _entityScripts[entityID] = newDetails;
1459+ return;
1460+ }
1461+
14271462 QScriptProgram program(contents, fileName);
14281463 if (!hasCorrectSyntax(program, this)) {
14291464 if (!isFileUrl) {
14301465 scriptCache->addScriptToBadScriptList(scriptOrURL);
14311466 }
1467+ newDetails.status = ERROR_RUNNING_SCRIPT;
1468+ newDetails.errorInfo = "Bad syntax";
1469+ _entityScripts[entityID] = newDetails;
14321470 return; // done processing script
14331471 }
14341472
@@ -1453,7 +1491,13 @@ void ScriptEngine::entityScriptContentAvailable(const EntityItemID& entityID, co · 18 unmodified lines
14531491 });
14541492 testConstructor = sandbox.evaluate(program);
14551493 }
1456− if (hadUncaughtExceptions(sandbox, program.fileName(), this)) {
1494+
1495+ QString exceptionMessage;
1496+ if (hadUncaughtExceptions(sandbox, program.fileName(), this, &exceptionMessage)) {
1497+ newDetails.status = ERROR_RUNNING_SCRIPT;
1498+ newDetails.errorInfo = exceptionMessage;
1499+ _entityScripts[entityID] = newDetails;
1500+
14571501 return;
14581502 }
14591503
@@ -1476,6 +1520,10 @@ void ScriptEngine::entityScriptContentAvailable(const EntityItemID& entityID, co · 16 unmodified lines
14761520 scriptCache->addScriptToBadScriptList(scriptOrURL);
14771521 }
14781522
1523+ newDetails.status = ERROR_RUNNING_SCRIPT;
1524+ newDetails.errorInfo = "Could not find constructor";
1525+ _entityScripts[entityID] = newDetails;
1526+
14791527 return; // done processing script
14801528 }
14811529
@@ -1492,8 +1540,11 @@ void ScriptEngine::entityScriptContentAvailable(const EntityItemID& entityID, co · 10 unmodified lines
14921540 };
14931541 doWithEnvironment(entityID, sandboxURL, initialization);
14941542
1495− EntityScriptDetails newDetails = { scriptOrURL, entityScriptObject, lastModified, sandboxURL };
1543+ newDetails.scriptObject = entityScriptObject;
1544+ newDetails.lastModified = lastModified;
1545+ newDetails.definingSandboxURL = sandboxURL;
14961546 _entityScripts[entityID] = newDetails;
1547+
14971548 if (isURL) {
14981549 setParentURL("");
14991550 }
@@ -1519,7 +1570,9 @@ void ScriptEngine::unloadEntityScript(const EntityItemID& entityID) { · 19 unmodified lines
15191570 #endif
15201571
15211572 if (_entityScripts.contains(entityID)) {
1522− callEntityScriptMethod(entityID, "unload");
1573+ if (_entityScripts[entityID].status == RUNNING) {
1574+ callEntityScriptMethod(entityID, "unload");
1575+ }
15231576 _entityScripts.remove(entityID);
15241577 stopAllTimersForEntityScript(entityID);
15251578 }
@@ -1538,7 +1591,9 @@ void ScriptEngine::unloadAllEntityScripts() { · 12 unmodified lines
15381591 qCDebug(scriptengine) << "ScriptEngine::unloadAllEntityScripts() called on correct thread [" << thread() << "]";
15391592 #endif
15401593 foreach(const EntityItemID& entityID, _entityScripts.keys()) {
1541− callEntityScriptMethod(entityID, "unload");
1594+ if (_entityScripts[entityID].status == RUNNING) {
1595+ callEntityScriptMethod(entityID, "unload");
1596+ }
15421597 }
15431598 _entityScripts.clear();
15441599
@@ -1577,7 +1632,7 @@ void ScriptEngine::refreshFileScript(const EntityItemID& entityID) { · 32 unmodified lines
15771632 QString scriptContents = QTextStream(&file).readAll();
15781633 this->unloadEntityScript(entityID);
15791634 this->entityScriptContentAvailable(entityID, details.scriptText, scriptContents, true, true);
1580− if (!_entityScripts.contains(entityID)) {
1635+ if (!_entityScripts.contains(entityID) || _entityScripts[entityID].status != RUNNING) {
15811636 scriptWarningMessage("Reload script " + details.scriptText + " failed");
15821637 } else {
15831638 details = _entityScripts[entityID];
@@ -1636,7 +1691,7 @@ void ScriptEngine::callEntityScriptMethod(const EntityItemID& entityID, const QS · 52 unmodified lines
16361691 #endif
16371692
16381693 refreshFileScript(entityID);
1639− if (_entityScripts.contains(entityID)) {
1694+ if (_entityScripts.contains(entityID) && _entityScripts[entityID].status == RUNNING) {
16401695 EntityScriptDetails details = _entityScripts[entityID];
16411696 QScriptValue entityScript = details.scriptObject; // previously loaded
16421697 if (entityScript.property(methodName).isFunction()) {
@@ -1668,7 +1723,7 @@ void ScriptEngine::callEntityScriptMethod(const EntityItemID& entityID, const QS · 25 unmodified lines
16681723 #endif
16691724
16701725 refreshFileScript(entityID);
1671− if (_entityScripts.contains(entityID)) {
1726+ if (_entityScripts.contains(entityID) && _entityScripts[entityID].status == RUNNING) {
16721727 EntityScriptDetails details = _entityScripts[entityID];
16731728 QScriptValue entityScript = details.scriptObject; // previously loaded
16741729 if (entityScript.property(methodName).isFunction()) {
@@ -1701,7 +1756,7 @@ void ScriptEngine::callEntityScriptMethod(const EntityItemID& entityID, const QS · 26 unmodified lines
17011756 #endif
17021757
17031758 refreshFileScript(entityID);
1704− if (_entityScripts.contains(entityID)) {
1759+ if (_entityScripts.contains(entityID) && _entityScripts[entityID].status == RUNNING) {
17051760 EntityScriptDetails details = _entityScripts[entityID];
17061761 QScriptValue entityScript = details.scriptObject; // previously loaded
17071762 if (entityScript.property(methodName).isFunction()) {