Ugly workaround agains the crash when TelldusCenter exits. We are now leaking instead (only at shutdown though)

This commit is contained in:
Micke Prag 2011-02-23 11:51:31 +00:00
parent 75debda9ee
commit 3bdada5b88

View file

@ -18,7 +18,7 @@ public:
class ScriptEnvironment::PrivateData { class ScriptEnvironment::PrivateData {
public: public:
QScriptEngine scriptEngine; QScriptEngine *scriptEngine;
QHash<int, QScriptValue> intervalHash; QHash<int, QScriptValue> intervalHash;
QHash<int, TimerObj*> timeoutHash; QHash<int, TimerObj*> timeoutHash;
}; };
@ -27,59 +27,61 @@ ScriptEnvironment::ScriptEnvironment(QObject *parent) :
QObject(parent) QObject(parent)
{ {
d = new PrivateData; d = new PrivateData;
d->scriptEngine = new QScriptEngine();
connect(&d->scriptEngine, SIGNAL(signalHandlerException(const QScriptValue &)), this, SLOT(scriptException(const QScriptValue&))); connect(d->scriptEngine, SIGNAL(signalHandlerException(const QScriptValue &)), this, SLOT(scriptException(const QScriptValue&)));
d->scriptEngine.installTranslatorFunctions(); d->scriptEngine->installTranslatorFunctions();
//Self is our new global object //Self is our new global object
QScriptValue self = d->scriptEngine.newQObject(this, QScriptEngine::QtOwnership, QScriptEngine::ExcludeSuperClassContents); QScriptValue self = d->scriptEngine->newQObject(this, QScriptEngine::QtOwnership, QScriptEngine::ExcludeSuperClassContents);
{ {
//Copy everything from our old global object //Copy everything from our old global object
QScriptValueIterator it(d->scriptEngine.globalObject()); QScriptValueIterator it(d->scriptEngine->globalObject());
while (it.hasNext()) { while (it.hasNext()) {
it.next(); it.next();
self.setProperty(it.scriptName(), it.value(), it.flags()); self.setProperty(it.scriptName(), it.value(), it.flags());
} }
} }
self.setProperty("self", self); self.setProperty("self", self);
d->scriptEngine.setGlobalObject(self); d->scriptEngine->setGlobalObject(self);
QScriptValue application = d->scriptEngine.newQObject(parent); QScriptValue application = d->scriptEngine->newQObject(parent);
d->scriptEngine.globalObject().setProperty("application", application); d->scriptEngine->globalObject().setProperty("application", application);
//Create configuration dialog //Create configuration dialog
QScriptValue configurationDialogObject = d->scriptEngine.newQObject(new ConfigurationDialog(&d->scriptEngine), QScriptEngine::ScriptOwnership, QScriptEngine::ExcludeSuperClassContents); QScriptValue configurationDialogObject = d->scriptEngine->newQObject(new ConfigurationDialog(d->scriptEngine), QScriptEngine::ScriptOwnership, QScriptEngine::ExcludeSuperClassContents);
d->scriptEngine.globalObject().property("application").setProperty("configuration", configurationDialogObject); d->scriptEngine->globalObject().property("application").setProperty("configuration", configurationDialogObject);
//Collect garbage (ie our old global object) //Collect garbage (ie our old global object)
d->scriptEngine.collectGarbage(); d->scriptEngine->collectGarbage();
} }
ScriptEnvironment::~ScriptEnvironment() { ScriptEnvironment::~ScriptEnvironment() {
foreach(TimerObj *tim, d->timeoutHash){ foreach(TimerObj *tim, d->timeoutHash){
delete tim; delete tim;
} }
// delete d->scriptEngine; //This seems to crash for some reason?
delete d; delete d;
} }
QDir ScriptEnvironment::currentDir() const { QDir ScriptEnvironment::currentDir() const {
QScriptContextInfo info(d->scriptEngine.currentContext()->parentContext()); QScriptContextInfo info(d->scriptEngine->currentContext()->parentContext());
QFileInfo fileinfo(info.fileName()); QFileInfo fileinfo(info.fileName());
return fileinfo.dir(); return fileinfo.dir();
} }
QScriptEngine *ScriptEnvironment::engine() const { QScriptEngine *ScriptEnvironment::engine() const {
return &d->scriptEngine; return d->scriptEngine;
} }
void ScriptEnvironment::scriptException(const QScriptValue & exception) { void ScriptEnvironment::scriptException(const QScriptValue & exception) {
qDebug() << "ScriptException:" << d->scriptEngine.uncaughtExceptionLineNumber() << exception.toString(); qDebug() << "ScriptException:" << d->scriptEngine->uncaughtExceptionLineNumber() << exception.toString();
qDebug() << "Backtrace:"; qDebug() << "Backtrace:";
foreach( QString row, d->scriptEngine.uncaughtExceptionBacktrace() ) { foreach( QString row, d->scriptEngine->uncaughtExceptionBacktrace() ) {
qDebug() << row; qDebug() << row;
} }
d->scriptEngine.clearExceptions(); d->scriptEngine->clearExceptions();
} }
void ScriptEnvironment::include(const QString &filename) { void ScriptEnvironment::include(const QString &filename) {
@ -90,11 +92,11 @@ void ScriptEnvironment::include(const QString &filename) {
QString fileContents = file.readAll(); QString fileContents = file.readAll();
file.close(); file.close();
QScriptContext *ctx = d->scriptEngine.currentContext(); QScriptContext *ctx = d->scriptEngine->currentContext();
ctx->setActivationObject(ctx->parentContext()->activationObject()); ctx->setActivationObject(ctx->parentContext()->activationObject());
d->scriptEngine.evaluate(fileContents, dir.filePath(filename)); d->scriptEngine->evaluate(fileContents, dir.filePath(filename));
} }
void ScriptEnvironment::timerEvent(QTimerEvent *event) { void ScriptEnvironment::timerEvent(QTimerEvent *event) {
@ -125,7 +127,7 @@ void ScriptEnvironment::timerEvent(QTimerEvent *event) {
} }
if (expression.isString()) { if (expression.isString()) {
d->scriptEngine.evaluate(expression.toString()); d->scriptEngine->evaluate(expression.toString());
} else if (expression.isFunction()) { } else if (expression.isFunction()) {
expression.call(); expression.call();
} }