summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kamm <christian.d.kamm@nokia.com>2010-04-08 11:44:04 +0200
committerChristian Kamm <christian.d.kamm@nokia.com>2010-04-08 11:51:00 +0200
commit892ef344292ee15d1b5c265a83e3250b8b7dab00 (patch)
treec991e29f4da3889e8ae62a1c0c03aaffe6064930
parent089b522f47fd0f0cb24b6b83c68eaf9dcf5c635e (diff)
Make 'print' in scripts not crash on Windows.
Migrated from: 1d50ea8705aef91be0407898be61002b6d486e8c
-rw-r--r--library/scriptadapter.cpp32
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();