From 63ca71c2c7548426810139a6ef66a33065d8cf96 Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Wed, 27 Oct 2010 16:56:04 +0200
Subject: [PATCH] jsdebugger: use QByteArray for data transfer

Easier to debug, less data to transfer.
---
 .../qml/qmljsdebugger/jsdebuggeragent.cpp     | 128 ++++++++++--------
 src/plugins/debugger/qml/qmlengine.cpp        |  14 +-
 2 files changed, 76 insertions(+), 66 deletions(-)

diff --git a/share/qtcreator/qml/qmljsdebugger/jsdebuggeragent.cpp b/share/qtcreator/qml/qmljsdebugger/jsdebuggeragent.cpp
index 00b6ea27489..4e208126e71 100644
--- a/share/qtcreator/qml/qmljsdebugger/jsdebuggeragent.cpp
+++ b/share/qtcreator/qml/qmljsdebugger/jsdebuggeragent.cpp
@@ -73,70 +73,78 @@ public:
     }
 };
 
-class JSAgentWatchData {
+class JSAgentWatchData
+{
 public:
     QByteArray exp;
-    QString name;
-    QString value;
-    QString type;
+    QByteArray name;
+    QByteArray value;
+    QByteArray type;
     bool hasChildren;
     quint64 objectId;
-
-    static JSAgentWatchData fromScriptValue(const QString &expression, const QScriptValue &value)
-    {
-        JSAgentWatchData data;
-        data.exp = expression.toUtf8();
-        data.name = expression;
-        data.hasChildren = false;
-        data.value = value.toString();
-        data.objectId = value.objectId();
-        if (value.isArray()) {
-            data.type = QLatin1String("Array");
-            data.value = QString::fromLatin1("[Array of length %1]").arg(value.property("length").toString());
-            data.hasChildren = true;
-        } else if (value.isBool()) {
-            data.type = QLatin1String("Bool");
-//            data.value = value.toBool() ? QLatin1String("true") : QLatin1String("false");
-        } else if (value.isDate()) {
-            data.type = QLatin1String("Date");
-            data.value = value.toDateTime().toString();
-        } else if (value.isError()) {
-            data.type = QLatin1String("Error");
-        } else if (value.isFunction()) {
-            data.type = QLatin1String("Function");
-        } else if (value.isUndefined()) {
-            data.type = QLatin1String("<undefined>");
-        } else if (value.isNumber()) {
-            data.type = QLatin1String("Number");
-        } else if (value.isRegExp()) {
-            data.type = QLatin1String("RegExp");
-        } else if (value.isString()) {
-            data.type = QLatin1String("String");
-        } else if (value.isVariant()) {
-            data.type = QLatin1String("Variant");
-        } else if (value.isQObject()) {
-            const QObject *obj = value.toQObject();
-            data.value = QString::fromLatin1("[%1]").arg(obj->metaObject()->className());
-            data.type = QLatin1String("Object");
-            data.hasChildren = true;
-        } else if (value.isObject()) {
-            data.type = QLatin1String("Object");
-            data.hasChildren = true;
-            data.type = QLatin1String("Object");
-            data.value = QLatin1String("[Object]");
-        } else if (value.isNull()) {
-            data.type = QLatin1String("<null>");
-        } else {
-            data.type = QLatin1String("<unknown>");
-        }
-        return data;
-    }
 };
 
+static JSAgentWatchData fromScriptValue(const QString &expression,
+    const QScriptValue &value)
+{
+    static const QString arrayStr = QCoreApplication::translate
+        ("Debugger::JSAgentWatchData", "[Array of length %1]");
+    static const QString undefinedStr = QCoreApplication::translate
+        ("Debugger::JSAgentWatchData", "<undefined>");
+
+    JSAgentWatchData data;
+    data.exp = expression.toUtf8();
+    data.name = data.exp;
+    data.hasChildren = false;
+    data.value = value.toString().toUtf8();
+    data.objectId = value.objectId();
+    if (value.isArray()) {
+        data.type = "Array";
+        data.value = arrayStr.arg(value.property("length").toString()).toUtf8();
+        data.hasChildren = true;
+    } else if (value.isBool()) {
+        data.type = "Bool";
+        // data.value = value.toBool() ? "true" : "false";
+    } else if (value.isDate()) {
+        data.type = "Date";
+        data.value = value.toDateTime().toString().toUtf8();
+    } else if (value.isError()) {
+        data.type = "Error";
+    } else if (value.isFunction()) {
+        data.type = "Function";
+    } else if (value.isUndefined()) {
+        data.type = undefinedStr.toUtf8();
+    } else if (value.isNumber()) {
+        data.type = "Number";
+    } else if (value.isRegExp()) {
+        data.type = "RegExp";
+    } else if (value.isString()) {
+        data.type = "String";
+    } else if (value.isVariant()) {
+        data.type = "Variant";
+    } else if (value.isQObject()) {
+        const QObject *obj = value.toQObject();
+        data.type = "Object";
+        data.value += '[';
+        data.value += obj->metaObject()->className();
+        data.value += ']';
+        data.hasChildren = true;
+    } else if (value.isObject()) {
+        data.type = "Object";
+        data.hasChildren = true;
+        data.value = "[Object]";
+    } else if (value.isNull()) {
+        data.type = "<null>";
+    } else {
+        data.type = "<unknown>";
+    }
+    return data;
+}
 
-QDataStream& operator<<(QDataStream& s, const JSAgentWatchData& data)
+QDataStream &operator<<(QDataStream &s, const JSAgentWatchData &data)
 {
-    return s << data.exp << data.name << data.value << data.type << data.hasChildren << data.objectId;
+    return s << data.exp << data.name << data.value
+        << data.type << data.hasChildren << data.objectId;
 }
 
 static QList<JSAgentWatchData> expandObject(const QScriptValue &object)
@@ -153,7 +161,7 @@ static QList<JSAgentWatchData> expandObject(const QScriptValue &object)
             //  and it is not usefull in the debugger.
             continue;
         }
-        JSAgentWatchData data = JSAgentWatchData::fromScriptValue(it.name(), it.value());
+        JSAgentWatchData data = fromScriptValue(it.name(), it.value());
         data.exp.prepend(expPrefix);
         result << data;
     }
@@ -174,7 +182,7 @@ QList<JSAgentWatchData> JSDebuggerAgent::getLocals(QScriptContext *ctx)
         QScriptValue thisObject = ctx->thisObject();
         locals = expandObject(activationObject);
         if (thisObject.isObject() && thisObject.objectId() != engine()->globalObject().objectId())
-            locals.prepend(JSAgentWatchData::fromScriptValue("this", thisObject));
+            locals.prepend(fromScriptValue("this", thisObject));
         recordKnownObjects(locals);
         knownObjectIds << activationObject.objectId();
     }
@@ -375,7 +383,7 @@ void JSDebuggerAgent::messageReceived(const QByteArray& message)
         QString expr;
         ds >> id >> expr;
 
-        JSAgentWatchData data = JSAgentWatchData::fromScriptValue(expr, engine()->evaluate(expr));
+        JSAgentWatchData data = fromScriptValue(expr, engine()->evaluate(expr));
         knownObjectIds << data.objectId;
 
         QByteArray reply;
@@ -488,7 +496,7 @@ void JSDebuggerAgent::stopped(bool becauseOfException, const QScriptValue& excep
     }
     QList<JSAgentWatchData> watches;
     foreach (const QString &expr, watchExpressions)
-        watches << JSAgentWatchData::fromScriptValue(expr,  engine()->evaluate(expr));
+        watches << fromScriptValue(expr,  engine()->evaluate(expr));
     recordKnownObjects(watches);
 
     QList<JSAgentWatchData> locals = getLocals(engine()->currentContext());
diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp
index af13b37f952..c90e3950d0f 100644
--- a/src/plugins/debugger/qml/qmlengine.cpp
+++ b/src/plugins/debugger/qml/qmlengine.cpp
@@ -87,12 +87,14 @@ namespace Internal {
 QDataStream &operator>>(QDataStream &s, WatchData &data)
 {
     data = WatchData();
-    QString value;
-    QString type;
-    bool hasChildren;
-    s >> data.exp >> data.name >> value >> type >> hasChildren >> data.id;
-    data.setType(type.toUtf8(), false);
-    data.setValue(value);
+    QByteArray name;
+    QByteArray value;
+    QByteArray type;
+    bool hasChildren = false;
+    s >> data.exp >> name >> value >> type >> hasChildren >> data.id;
+    data.name = QString::fromUtf8(name);
+    data.setType(type, false);
+    data.setValue(QString::fromUtf8(value));
     data.setHasChildren(hasChildren);
     data.setAllUnneeded();
     return s;
-- 
GitLab