Console API: Print JS object
authorAurindam Jana <aurindam.jana@nokia.com>
Tue, 5 Jun 2012 11:34:40 +0000 (13:34 +0200)
committerQt by Nokia <qt-info@nokia.com>
Tue, 28 Aug 2012 12:05:28 +0000 (14:05 +0200)
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 <kai.koehne@nokia.com>
src/qml/qml/v8/qqmlbuiltinfunctions.cpp
tests/auto/qml/qqmlconsole/data/logging.qml
tests/auto/qml/qqmlconsole/tst_qqmlconsole.cpp

index c8508e7..3f0702e 100644 (file)
@@ -114,24 +114,35 @@ v8::Handle<v8::Value> 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<v8::Value> 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<v8::String> 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<v8::String> 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) {
index 44009b5..11f11f4 100644 (file)
@@ -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;};
index d96da67..1f17113 100644 (file)
@@ -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();