Showing the changes to libraries/script-engine/src/ScriptEngine.cpp (1 of 6 files). Show all
Unified · Split
| @@ -17,12 +17,18 @@ · 16 unmodified lines | |||
| 17 | #include <QtCore/QFileInfo> | 17 | #include <QtCore/QFileInfo> |
| 18 | #include <QtCore/QTimer> | 18 | #include <QtCore/QTimer> |
| 19 | #include <QtCore/QThread> | 19 | #include <QtCore/QThread> |
| 20 | #include <QtCore/QRegularExpression> | ||
| 21 | |||
| 22 | #include <QtWidgets/QMainWindow> | ||
| 23 | #include <QtWidgets/QApplication> | ||
| 24 | |||
| 20 | #include <QtNetwork/QNetworkRequest> | 25 | #include <QtNetwork/QNetworkRequest> |
| 21 | #include <QtNetwork/QNetworkReply> | 26 | #include <QtNetwork/QNetworkReply> |
| 22 | #include <QtScript/QScriptEngine> | 27 | |
| 23 | #include <QtScript/QScriptValue> | 28 | #include <QtScript/QScriptValue> |
| 24 | #include <QtScript/QScriptValueIterator> | 29 | #include <QtScript/QScriptValueIterator> |
| 25 | #include <QtCore/QStringList> | 30 | |
| 31 | #include <QtScriptTools/QScriptEngineDebugger> | ||
| 26 | 32 | ||
| 27 | #include <AudioConstants.h> | 33 | #include <AudioConstants.h> |
| 28 | #include <AudioEffectOptions.h> | 34 | #include <AudioEffectOptions.h> |
| @@ -34,6 +40,7 @@ · 5 unmodified lines | |||
| 34 | #include <NodeList.h> | 40 | #include <NodeList.h> |
| 35 | #include <udt/PacketHeaders.h> | 41 | #include <udt/PacketHeaders.h> |
| 36 | #include <UUID.h> | 42 | #include <UUID.h> |
| 43 | #include <ui/Menu.h> | ||
| 37 | 44 | ||
| 38 | #include <controllers/ScriptingInterface.h> | 45 | #include <controllers/ScriptingInterface.h> |
| 39 | #include <AnimationObject.h> | 46 | #include <AnimationObject.h> |
| @@ -169,6 +176,61 @@ void ScriptEngine::disconnectNonEssentialSignals() { · 129 unmodified lines | |||
| 169 | } | 176 | } |
| 170 | } | 177 | } |
| 171 | 178 | ||
| 179 | void ScriptEngine::runDebuggable() { | ||
| 180 | init(); | ||
| 181 | _isRunning = true; | ||
| 182 | _debuggable = true; | ||
| 183 | _debugger = new QScriptEngineDebugger(this); | ||
| 184 | _debugger->attachTo(this); | ||
| 185 | static QMenu* scriptDebugMenu = qobject_cast<QMainWindow*>(qApp->activeWindow())->menuBar()->addMenu("Script Debug"); | ||
| 186 | scriptDebugMenu->addMenu(_fileNameString)->addMenu(_debugger->createStandardMenu(qApp->activeWindow())); | ||
| 187 | _debugger->action(QScriptEngineDebugger::InterruptAction)->trigger(); | ||
| 188 | QScriptValue result = evaluate(_scriptContents, _fileNameString); | ||
| 189 | |||
| 190 | _lastUpdate = usecTimestampNow(); | ||
| 191 | QTimer* timer = new QTimer(this); | ||
| 192 | connect(this, &ScriptEngine::finished, [this, timer] { | ||
| 193 | disconnect(timer); | ||
| 194 | }); | ||
| 195 | |||
| 196 | connect(timer, &QTimer::timeout, [this, timer] { | ||
| 197 | if (_isFinished) { | ||
| 198 | if (!_isRunning) { | ||
| 199 | return; | ||
| 200 | } | ||
| 201 | stopAllTimers(); // make sure all our timers are stopped if the script is ending | ||
| 202 | if (_wantSignals) { | ||
| 203 | emit scriptEnding(); | ||
| 204 | emit finished(_fileNameString, this); | ||
| 205 | } | ||
| 206 | _isRunning = false; | ||
| 207 | if (_wantSignals) { | ||
| 208 | emit runningStateChanged(); | ||
| 209 | emit doneRunning(); | ||
| 210 | } | ||
| 211 | timer->deleteLater(); | ||
| 212 | return; | ||
| 213 | } | ||
| 214 | |||
| 215 | qint64 now = usecTimestampNow(); | ||
| 216 | // we check for 'now' in the past in case people set their clock back | ||
| 217 | if (_lastUpdate < now) { | ||
| 218 | float deltaTime = (float)(now - _lastUpdate) / (float)USECS_PER_SECOND; | ||
| 219 | if (!_isFinished) { | ||
| 220 | if (_wantSignals) { | ||
| 221 | emit update(deltaTime); | ||
| 222 | } | ||
| 223 | } | ||
| 224 | } | ||
| 225 | _lastUpdate = now; | ||
| 226 | // Debug and clear exceptions | ||
| 227 | hadUncaughtExceptions(*this, _fileNameString); | ||
| 228 | }); | ||
| 229 | |||
| 230 | timer->start(10); | ||
| 231 | } | ||
| 232 | |||
| 233 | |||
| 172 | void ScriptEngine::runInThread() { | 234 | void ScriptEngine::runInThread() { |
| 173 | Q_ASSERT_X(!_isThreaded, "ScriptEngine::runInThread()", "runInThread should not be called more than once"); | 235 | Q_ASSERT_X(!_isThreaded, "ScriptEngine::runInThread()", "runInThread should not be called more than once"); |
| 174 | 236 | ||
| @@ -260,6 +322,10 @@ void ScriptEngine::loadURL(const QUrl& scriptURL, bool reload) { · 85 unmodified lines | |||
| 260 | // FIXME - switch this to the new model of ScriptCache callbacks | 322 | // FIXME - switch this to the new model of ScriptCache callbacks |
| 261 | void ScriptEngine::scriptContentsAvailable(const QUrl& url, const QString& scriptContents) { | 323 | void ScriptEngine::scriptContentsAvailable(const QUrl& url, const QString& scriptContents) { |
| 262 | _scriptContents = scriptContents; | 324 | _scriptContents = scriptContents; |
| 325 | static const QString DEBUG_FLAG("#debug"); | ||
| 326 | if (QRegularExpression(DEBUG_FLAG).match(scriptContents).hasMatch()) { | ||
| 327 | _debuggable = true; | ||
| 328 | } | ||
| 263 | if (_wantSignals) { | 329 | if (_wantSignals) { |
| 264 | emit scriptLoaded(url.toString()); | 330 | emit scriptLoaded(url.toString()); |
| 265 | } | 331 | } |
| @@ -723,7 +789,7 @@ void ScriptEngine::run() { · 457 unmodified lines | |||
| 723 | auto nodeList = DependencyManager::get<NodeList>(); | 789 | auto nodeList = DependencyManager::get<NodeList>(); |
| 724 | auto entityScriptingInterface = DependencyManager::get<EntityScriptingInterface>(); | 790 | auto entityScriptingInterface = DependencyManager::get<EntityScriptingInterface>(); |
| 725 | 791 | ||
| 726 | qint64 lastUpdate = usecTimestampNow(); | 792 | _lastUpdate = usecTimestampNow(); |
| 727 | 793 | ||
| 728 | // TODO: Integrate this with signals/slots instead of reimplementing throttling for ScriptEngine | 794 | // TODO: Integrate this with signals/slots instead of reimplementing throttling for ScriptEngine |
| 729 | while (!_isFinished) { | 795 | while (!_isFinished) { |
| @@ -771,15 +837,15 @@ void ScriptEngine::run() { · 41 unmodified lines | |||
| 771 | qint64 now = usecTimestampNow(); | 837 | qint64 now = usecTimestampNow(); |
| 772 | 838 | ||
| 773 | // we check for 'now' in the past in case people set their clock back | 839 | // we check for 'now' in the past in case people set their clock back |
| 774 | if (lastUpdate < now) { | 840 | if (_lastUpdate < now) { |
| 775 | float deltaTime = (float) (now - lastUpdate) / (float) USECS_PER_SECOND; | 841 | float deltaTime = (float) (now - _lastUpdate) / (float) USECS_PER_SECOND; |
| 776 | if (!_isFinished) { | 842 | if (!_isFinished) { |
| 777 | if (_wantSignals) { | 843 | if (_wantSignals) { |
| 778 | emit update(deltaTime); | 844 | emit update(deltaTime); |
| 779 | } | 845 | } |
| 780 | } | 846 | } |
| 781 | } | 847 | } |
| 782 | lastUpdate = now; | 848 | _lastUpdate = now; |
| 783 | 849 | ||
| 784 | // Debug and clear exceptions | 850 | // Debug and clear exceptions |
| 785 | hadUncaughtExceptions(*this, _fileNameString); | 851 | hadUncaughtExceptions(*this, _fileNameString); |