diff options
author | Christian Kamm <christian.d.kamm@nokia.com> | 2010-04-08 11:44:04 +0200 |
---|---|---|
committer | Christian Kamm <christian.d.kamm@nokia.com> | 2010-04-08 11:51:00 +0200 |
commit | 892ef344292ee15d1b5c265a83e3250b8b7dab00 (patch) | |
tree | c991e29f4da3889e8ae62a1c0c03aaffe6064930 | |
parent | 089b522f47fd0f0cb24b6b83c68eaf9dcf5c635e (diff) |
Make 'print' in scripts not crash on Windows.
Migrated from: 1d50ea8705aef91be0407898be61002b6d486e8c
-rw-r--r-- | library/scriptadapter.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/library/scriptadapter.cpp b/library/scriptadapter.cpp index 17d8d25..ba196c7 100644 --- a/library/scriptadapter.cpp +++ b/library/scriptadapter.cpp @@ -42,6 +42,10 @@ #include <QtCore/QDebug> #include <QtGui/QMessageBox> +#ifdef Q_OS_WIN +#include <windows.h> +#endif + template <typename Enum> static void scriptToEnum(const QScriptValue &obj, Enum &e) { @@ -177,6 +181,30 @@ void ScriptAdapter::messageBox(const QString &text) mCurrentScript->endBlocking(); } +static QScriptValue safePrint(QScriptContext *context, QScriptEngine *engine) +{ + QString result; + for (int i = 0; i < context->argumentCount(); ++i) { + if (i != 0) + result.append(QLatin1Char(' ')); + QString s(context->argument(i).toString()); + if (engine->hasUncaughtException()) + break; + result.append(s); + } + if (engine->hasUncaughtException()) + return engine->uncaughtException(); + +#ifdef Q_OS_WIN + if (IsDebuggerPresent()) + qDebug("%s", qPrintable(result)); +#else + qDebug("%s", qPrintable(result)); +#endif + + return engine->undefinedValue(); +} + Script::Script(const QString &name, const QString &scriptCode, ScriptAdapter *adapter) : QObject(adapter) @@ -203,6 +231,10 @@ Script::Script(const QString &name, const QString &scriptCode, mEngine.globalObject().setProperty(functionName, functionValue); } + // override print, the default uses qDebug and that is not allowed in coroutines! + QScriptValue printFn = mEngine.newFunction(safePrint, 1); + mEngine.globalObject().setProperty("print", printFn); + QHashIterator<QString, QObject *> iter(mAdapter->mScriptInterfaces); while (iter.hasNext()) { iter.next(); |