Showing the changes to libraries/script-engine/src/ScriptEngine.cpp (1 of 18 files). Show all
Unified · Split
| @@ -153,6 +153,15 @@ QString ScriptEngine::logException(const QScriptValue& exception) { · 152 unmodified lines | ||
| 153 | 153 | return message; |
| 154 | 154 | } |
| 155 | 155 | |
| 156 | +QSharedPointer<ScriptEngine> scriptEngineFactory(ScriptEngine::Context context, | |
| 157 | + const QString& scriptContents, | |
| 158 | + const QString& fileNameString) { | |
| 159 | + ScriptEngine* engine = new ScriptEngine(context, scriptContents, fileNameString); | |
| 160 | + QSharedPointer<ScriptEngine> engineSP = QSharedPointer<ScriptEngine>(engine); | |
| 161 | + DependencyManager::get<ScriptEngines>()->addScriptEngine(qSharedPointerCast<ScriptEngine>(engineSP)); | |
| 162 | + return engineSP; | |
| 163 | +} | |
| 164 | + | |
| 156 | 165 | int ScriptEngine::processLevelMaxRetries { ScriptRequest::MAX_RETRIES }; |
| 157 | 166 | ScriptEngine::ScriptEngine(Context context, const QString& scriptContents, const QString& fileNameString) : |
| 158 | 167 | BaseScriptEngine(), |
| @@ -160,10 +169,10 @@ ScriptEngine::ScriptEngine(Context context, const QString& scriptContents, const · 1 unmodified line | ||
| 160 | 169 | _scriptContents(scriptContents), |
| 161 | 170 | _timerFunctionMap(), |
| 162 | 171 | _fileNameString(fileNameString), |
| 163 | − _arrayBufferClass(new ArrayBufferClass(this)) | |
| 172 | + _arrayBufferClass(new ArrayBufferClass(this)), | |
| 173 | + // don't delete `ScriptEngines` until all `ScriptEngine`s are gone | |
| 174 | + _scriptEngines(DependencyManager::get<ScriptEngines>()) | |
| 164 | 175 | { |
| 165 | − DependencyManager::get<ScriptEngines>()->addScriptEngine(this); | |
| 166 | − | |
| 167 | 176 | connect(this, &QScriptEngine::signalHandlerException, this, [this](const QScriptValue& exception) { |
| 168 | 177 | if (hasUncaughtException()) { |
| 169 | 178 | // the engine's uncaughtException() seems to produce much better stack traces here |
| @@ -208,22 +217,9 @@ QString ScriptEngine::getContext() const { · 38 unmodified lines | ||
| 208 | 217 | } |
| 209 | 218 | |
| 210 | 219 | ScriptEngine::~ScriptEngine() { |
| 211 | − // FIXME: are these scriptInfoMessage/scriptWarningMessage segfaulting anybody else at app shutdown? | |
| 212 | −#if !defined(Q_OS_LINUX) | |
| 213 | − scriptInfoMessage("Script Engine shutting down:" + getFilename()); | |
| 214 | −#else | |
| 215 | − qCDebug(scriptengine) << "~ScriptEngine()" << this; | |
| 216 | −#endif | |
| 217 | − | |
| 218 | 220 | auto scriptEngines = DependencyManager::get<ScriptEngines>(); |
| 219 | 221 | if (scriptEngines) { |
| 220 | − scriptEngines->removeScriptEngine(this); | |
| 221 | − } else { | |
| 222 | −#if !defined(Q_OS_LINUX) | |
| 223 | − scriptWarningMessage("Script destroyed after ScriptEngines!"); | |
| 224 | −#else | |
| 225 | − qCWarning(scriptengine) << ("Script destroyed after ScriptEngines!"); | |
| 226 | −#endif | |
| 222 | + scriptEngines->removeScriptEngine(qSharedPointerCast<ScriptEngine>(sharedFromThis())); | |
| 227 | 223 | } |
| 228 | 224 | } |
| 229 | 225 | |
| @@ -294,7 +290,7 @@ void ScriptEngine::runDebuggable() { · 64 unmodified lines | ||
| 294 | 290 | stopAllTimers(); // make sure all our timers are stopped if the script is ending |
| 295 | 291 | |
| 296 | 292 | emit scriptEnding(); |
| 297 | − emit finished(_fileNameString, this); | |
| 293 | + emit finished(_fileNameString, qSharedPointerCast<ScriptEngine>(sharedFromThis())); | |
| 298 | 294 | _isRunning = false; |
| 299 | 295 | |
| 300 | 296 | emit runningStateChanged(); |
| @@ -503,7 +499,8 @@ static void animVarMapFromScriptValue(const QScriptValue& value, AnimVariantMap& · 202 unmodified lines | ||
| 503 | 499 | parameters.animVariantMapFromScriptValue(value); |
| 504 | 500 | } |
| 505 | 501 | // ... while these two are not. But none of the four are ever used. |
| 506 | −static QScriptValue resultHandlerToScriptValue(QScriptEngine* engine, const AnimVariantResultHandler& resultHandler) { | |
| 502 | +static QScriptValue resultHandlerToScriptValue(QScriptEngine* engine, | |
| 503 | + const AnimVariantResultHandler& resultHandler) { | |
| 507 | 504 | qCCritical(scriptengine) << "Attempt to marshall result handler to javascript"; |
| 508 | 505 | assert(false); |
| 509 | 506 | return QScriptValue(); |
| @@ -516,7 +513,8 @@ static void resultHandlerFromScriptValue(const QScriptValue& value, AnimVariantR · 6 unmodified lines | ||
| 516 | 513 | // Templated qScriptRegisterMetaType fails to compile with raw pointers |
| 517 | 514 | using ScriptableResourceRawPtr = ScriptableResource*; |
| 518 | 515 | |
| 519 | −static QScriptValue scriptableResourceToScriptValue(QScriptEngine* engine, const ScriptableResourceRawPtr& resource) { | |
| 516 | +static QScriptValue scriptableResourceToScriptValue(QScriptEngine* engine, | |
| 517 | + const ScriptableResourceRawPtr& resource) { | |
| 520 | 518 | // The first script to encounter this resource will track its memory. |
| 521 | 519 | // In this way, it will be more likely to GC. |
| 522 | 520 | // This fails in the case that the resource is used across many scripts, but |
| @@ -539,11 +537,11 @@ static void scriptableResourceFromScriptValue(const QScriptValue& value, Scripta · 16 unmodified lines | ||
| 539 | 537 | resource = static_cast<ScriptableResourceRawPtr>(value.toQObject()); |
| 540 | 538 | } |
| 541 | 539 | |
| 542 | −static QScriptValue createScriptableResourcePrototype(QScriptEngine* engine) { | |
| 540 | +static QScriptValue createScriptableResourcePrototype(QSharedPointer<ScriptEngine> engine) { | |
| 543 | 541 | auto prototype = engine->newObject(); |
| 544 | 542 | |
| 545 | 543 | // Expose enum State to JS/QML via properties |
| 546 | − QObject* state = new QObject(engine); | |
| 544 | + QObject* state = new QObject(engine.data()); | |
| 547 | 545 | state->setObjectName("ResourceState"); |
| 548 | 546 | auto metaEnum = QMetaEnum::fromType<ScriptableResource::State>(); |
| 549 | 547 | for (int i = 0; i < metaEnum.keyCount(); ++i) { |
| @@ -693,7 +691,7 @@ void ScriptEngine::init() { · 143 unmodified lines | ||
| 693 | 691 | qScriptRegisterMetaType(this, resultHandlerToScriptValue, resultHandlerFromScriptValue); |
| 694 | 692 | |
| 695 | 693 | // Scriptable cache access |
| 696 | − auto resourcePrototype = createScriptableResourcePrototype(this); | |
| 694 | + auto resourcePrototype = createScriptableResourcePrototype(qSharedPointerCast<ScriptEngine>(sharedFromThis())); | |
| 697 | 695 | globalObject().setProperty("Resource", resourcePrototype); |
| 698 | 696 | setDefaultPrototype(qMetaTypeId<ScriptableResource*>(), resourcePrototype); |
| 699 | 697 | qScriptRegisterMetaType(this, scriptableResourceToScriptValue, scriptableResourceFromScriptValue); |
| @@ -1178,7 +1176,7 @@ void ScriptEngine::run() { · 478 unmodified lines | ||
| 1178 | 1176 | } |
| 1179 | 1177 | } |
| 1180 | 1178 | |
| 1181 | − emit finished(_fileNameString, this); | |
| 1179 | + emit finished(_fileNameString, qSharedPointerCast<ScriptEngine>(sharedFromThis())); | |
| 1182 | 1180 | |
| 1183 | 1181 | _isRunning = false; |
| 1184 | 1182 | emit runningStateChanged(); |