History

rework ScriptEngine lifetimes using 'smart' pointers

Seth Alves committed 9 years ago

Commit d89f2b71 parent 49ab8af18 files · +135 −146Browse files

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

Unified · Split

libraries/script-engine/src/ScriptEngine.cpp+22−24
@@ -153,6 +153,15 @@ QString ScriptEngine::logException(const QScriptValue& exception) { · 152 unmodified lines
153153 return message;
154154 }
155155
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+
156165 int ScriptEngine::processLevelMaxRetries { ScriptRequest::MAX_RETRIES };
157166 ScriptEngine::ScriptEngine(Context context, const QString& scriptContents, const QString& fileNameString) :
158167 BaseScriptEngine(),
@@ -160,10 +169,10 @@ ScriptEngine::ScriptEngine(Context context, const QString& scriptContents, const · 1 unmodified line
160169 _scriptContents(scriptContents),
161170 _timerFunctionMap(),
162171 _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>())
164175 {
165− DependencyManager::get<ScriptEngines>()->addScriptEngine(this);
166−
167176 connect(this, &QScriptEngine::signalHandlerException, this, [this](const QScriptValue& exception) {
168177 if (hasUncaughtException()) {
169178 // the engine's uncaughtException() seems to produce much better stack traces here
@@ -208,22 +217,9 @@ QString ScriptEngine::getContext() const { · 38 unmodified lines
208217 }
209218
210219 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−
218220 auto scriptEngines = DependencyManager::get<ScriptEngines>();
219221 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()));
227223 }
228224 }
229225
@@ -294,7 +290,7 @@ void ScriptEngine::runDebuggable() { · 64 unmodified lines
294290 stopAllTimers(); // make sure all our timers are stopped if the script is ending
295291
296292 emit scriptEnding();
297− emit finished(_fileNameString, this);
293+ emit finished(_fileNameString, qSharedPointerCast<ScriptEngine>(sharedFromThis()));
298294 _isRunning = false;
299295
300296 emit runningStateChanged();
@@ -503,7 +499,8 @@ static void animVarMapFromScriptValue(const QScriptValue& value, AnimVariantMap& · 202 unmodified lines
503499 parameters.animVariantMapFromScriptValue(value);
504500 }
505501 // ... 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) {
507504 qCCritical(scriptengine) << "Attempt to marshall result handler to javascript";
508505 assert(false);
509506 return QScriptValue();
@@ -516,7 +513,8 @@ static void resultHandlerFromScriptValue(const QScriptValue& value, AnimVariantR · 6 unmodified lines
516513 // Templated qScriptRegisterMetaType fails to compile with raw pointers
517514 using ScriptableResourceRawPtr = ScriptableResource*;
518515
519−static QScriptValue scriptableResourceToScriptValue(QScriptEngine* engine, const ScriptableResourceRawPtr& resource) {
516+static QScriptValue scriptableResourceToScriptValue(QScriptEngine* engine,
517+ const ScriptableResourceRawPtr& resource) {
520518 // The first script to encounter this resource will track its memory.
521519 // In this way, it will be more likely to GC.
522520 // 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
539537 resource = static_cast<ScriptableResourceRawPtr>(value.toQObject());
540538 }
541539
542−static QScriptValue createScriptableResourcePrototype(QScriptEngine* engine) {
540+static QScriptValue createScriptableResourcePrototype(QSharedPointer<ScriptEngine> engine) {
543541 auto prototype = engine->newObject();
544542
545543 // Expose enum State to JS/QML via properties
546− QObject* state = new QObject(engine);
544+ QObject* state = new QObject(engine.data());
547545 state->setObjectName("ResourceState");
548546 auto metaEnum = QMetaEnum::fromType<ScriptableResource::State>();
549547 for (int i = 0; i < metaEnum.keyCount(); ++i) {
@@ -693,7 +691,7 @@ void ScriptEngine::init() { · 143 unmodified lines
693691 qScriptRegisterMetaType(this, resultHandlerToScriptValue, resultHandlerFromScriptValue);
694692
695693 // Scriptable cache access
696− auto resourcePrototype = createScriptableResourcePrototype(this);
694+ auto resourcePrototype = createScriptableResourcePrototype(qSharedPointerCast<ScriptEngine>(sharedFromThis()));
697695 globalObject().setProperty("Resource", resourcePrototype);
698696 setDefaultPrototype(qMetaTypeId<ScriptableResource*>(), resourcePrototype);
699697 qScriptRegisterMetaType(this, scriptableResourceToScriptValue, scriptableResourceFromScriptValue);
@@ -1178,7 +1176,7 @@ void ScriptEngine::run() { · 478 unmodified lines
11781176 }
11791177 }
11801178
1181− emit finished(_fileNameString, this);
1179+ emit finished(_fileNameString, qSharedPointerCast<ScriptEngine>(sharedFromThis()));
11821180
11831181 _isRunning = false;
11841182 emit runningStateChanged();