From cc878137fcf984eb1d6ecec74d4b807e49874d8b Mon Sep 17 00:00:00 2001 From: Aurindam Jana Date: Tue, 5 Jun 2012 13:34:40 +0200 Subject: [PATCH] Console API: Print JS object Calling console.log(), console.debug(), print() etc would only print out "Object" if a JS Object was passed as an argument. This patch calls the toString() on the object. Change-Id: Iadf8b4d1fe81c3e2c7bd65e3c153a930fd994bef Reviewed-by: Kai Koehne --- src/qml/qml/v8/qqmlbuiltinfunctions.cpp | 35 +++++++++++++++++--------- tests/auto/qml/qqmlconsole/data/logging.qml | 1 + tests/auto/qml/qqmlconsole/tst_qqmlconsole.cpp | 11 ++++---- 3 files changed, 30 insertions(+), 17 deletions(-) diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp index c8508e7..3f0702e 100644 --- a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp +++ b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp @@ -114,24 +114,35 @@ v8::Handle console(ConsoleLogTypes logType, const v8::Arguments &args v8::HandleScope handleScope; QString result; + QV8Engine *engine = V8ENGINE(); for (int i = 0; i < args.Length(); ++i) { if (i != 0) result.append(QLatin1Char(' ')); v8::Local value = args[i]; - //Check for Object Type - if (value->IsObject() && !value->IsFunction() - && !value->IsArray() && !value->IsDate() - && !value->IsRegExp()) { - result.append(QLatin1String("Object")); - } else { - v8::Local jsstr = value->ToString(); - QString tmp = V8ENGINE()->toString(jsstr); - if (value->IsArray()) - result.append(QString::fromLatin1("[%1]").arg(tmp)); - else - result.append(tmp); + + v8::TryCatch tryCatch; + v8::Local toString = value->ToString(); + if (tryCatch.HasCaught()) { + // toString() threw Exception + // Is it possible for value to be anything other than Object? + QString str; + if (value->IsObject()) { + str = QStringLiteral("[object Object]"); + } else { + toString = tryCatch.Exception()->ToString(); + str = QStringLiteral("toString() threw exception: %1") + .arg(engine->toString(toString)); + } + result.append(str); + continue; } + + QString tmp = engine->toString(toString); + if (value->IsArray()) + result.append(QStringLiteral("[%1]").arg(tmp)); + else + result.append(tmp); } if (printStack) { diff --git a/tests/auto/qml/qqmlconsole/data/logging.qml b/tests/auto/qml/qqmlconsole/data/logging.qml index 44009b5..11f11f4 100644 --- a/tests/auto/qml/qqmlconsole/data/logging.qml +++ b/tests/auto/qml/qqmlconsole/data/logging.qml @@ -62,6 +62,7 @@ QtObject { var a = [1, 2]; var b = {a: "hello", d: 1 }; + b.toString = function() { return JSON.stringify(b) } var c var d = 12; var e = function() { return 5;}; diff --git a/tests/auto/qml/qqmlconsole/tst_qqmlconsole.cpp b/tests/auto/qml/qqmlconsole/tst_qqmlconsole.cpp index d96da67..1f17113 100644 --- a/tests/auto/qml/qqmlconsole/tst_qqmlconsole.cpp +++ b/tests/auto/qml/qqmlconsole/tst_qqmlconsole.cpp @@ -77,15 +77,16 @@ void tst_qqmlconsole::logging() QTest::ignoreMessage(QtDebugMsg, ": 2"); QTest::ignoreMessage(QtDebugMsg, "[1,2]"); - QTest::ignoreMessage(QtDebugMsg, "Object"); + QTest::ignoreMessage(QtDebugMsg, "{\"a\":\"hello\",\"d\":1}"); QTest::ignoreMessage(QtDebugMsg, "undefined"); QTest::ignoreMessage(QtDebugMsg, "12"); QTest::ignoreMessage(QtDebugMsg, "function () { return 5;}"); QTest::ignoreMessage(QtDebugMsg, "true"); - QTest::ignoreMessage(QtDebugMsg, "Object"); - QTest::ignoreMessage(QtDebugMsg, "Object"); - QTest::ignoreMessage(QtDebugMsg, "1 pong! Object"); - QTest::ignoreMessage(QtDebugMsg, "1 [ping,pong] Object 2"); + // Printing QML object prints out the class/type of QML object with the memory address +// QTest::ignoreMessage(QtDebugMsg, "QtObject_QML_0(0xABCD..)"); + QTest::ignoreMessage(QtDebugMsg, "[object Object]"); + QTest::ignoreMessage(QtDebugMsg, "1 pong! [object Object]"); + QTest::ignoreMessage(QtDebugMsg, "1 [ping,pong] [object Object] 2"); QQmlComponent component(&engine, testUrl); QObject *object = component.create(); -- 2.7.4