From 9c66c068201feab7035b5991b199b37fa8c9ddc2 Mon Sep 17 00:00:00 2001
From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
Date: Mon, 30 Nov 2009 15:17:34 +0100
Subject: [PATCH] mi parser: don't construct dummy tuples, but parse lists
 directly

---
 src/plugins/debugger/gdb/gdbengine.cpp |  7 +++----
 src/plugins/debugger/gdb/gdbmi.cpp     |  7 +++++++
 src/plugins/debugger/gdb/gdbmi.h       |  2 +-
 src/plugins/debugger/watchutils.cpp    | 14 ++++----------
 4 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index b8fa6fa6747..7a2c00b12de 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -155,9 +155,8 @@ static bool parseConsoleStream(const GdbResponse &response, GdbMi *contents)
     out = out.left(out.lastIndexOf('"'));
     // optimization: dumper output never needs real C unquoting
     out.replace('\\', "");
-    out = "dummy={" + out + "}";
 
-    contents->fromString(out);
+    contents->fromStringMultiple(out);
     //qDebug() << "CONTENTS" << contents->toString(true);
     return contents->isValid();
 }
@@ -3584,8 +3583,8 @@ void GdbEngine::handleStackFrame(const GdbResponse &response)
                 << out.left(pos);
             out = out.mid(pos);
         }
-        GdbMi all("[" + out + "]");
-        //GdbMi all(out);
+        GdbMi all;
+        all.fromStringMultiple(out);
         
         //qDebug() << "\n\n\nALL: " << all.toString() << "\n";
         GdbMi locals = all.findChild("locals");
diff --git a/src/plugins/debugger/gdb/gdbmi.cpp b/src/plugins/debugger/gdb/gdbmi.cpp
index ffac5d76d15..639e698d36f 100644
--- a/src/plugins/debugger/gdb/gdbmi.cpp
+++ b/src/plugins/debugger/gdb/gdbmi.cpp
@@ -348,6 +348,13 @@ void GdbMi::fromString(const QByteArray &ba)
     parseResultOrValue(from, to);
 }
 
+void GdbMi::fromStringMultiple(const QByteArray &ba)
+{
+    const char *from = ba.constBegin();
+    const char *to = ba.constEnd();
+    parseTuple_helper(from, to);
+}
+
 GdbMi GdbMi::findChild(const char *name) const
 {
     for (int i = 0; i < m_children.size(); ++i)
diff --git a/src/plugins/debugger/gdb/gdbmi.h b/src/plugins/debugger/gdb/gdbmi.h
index 24295afea66..a4ce8375030 100644
--- a/src/plugins/debugger/gdb/gdbmi.h
+++ b/src/plugins/debugger/gdb/gdbmi.h
@@ -91,7 +91,6 @@ class GdbMi
 {
 public:
     GdbMi() : m_type(Invalid) {}
-    explicit GdbMi(const QByteArray &str) { fromString(str); }
 
     QByteArray m_name;
     QByteArray m_data;
@@ -126,6 +125,7 @@ public:
 
     QByteArray toString(bool multiline = false, int indent = 0) const;
     void fromString(const QByteArray &str);
+    void fromStringMultiple(const QByteArray &str);
     void setStreamOutput(const QByteArray &name, const QByteArray &content);
 
 private:
diff --git a/src/plugins/debugger/watchutils.cpp b/src/plugins/debugger/watchutils.cpp
index f5ef9250e7e..1c07ef499e3 100644
--- a/src/plugins/debugger/watchutils.cpp
+++ b/src/plugins/debugger/watchutils.cpp
@@ -975,11 +975,8 @@ bool QtDumperHelper::parseQuery(const GdbMi &contents, Debugger debugger)
 // parse a query
 bool QtDumperHelper::parseQuery(const char *data, Debugger debugger)
 {
-    QByteArray fullData = data;
-    fullData.insert(0, '{');
-    fullData.append(data);
-    fullData.append('}');
-    GdbMi root(fullData);
+    GdbMi root;
+    root.fromStringMultiple(QByteArray(data));
     if (!root.isValid())
         return false;
     return parseQuery(root, debugger);
@@ -1475,11 +1472,8 @@ bool QtDumperHelper::parseValue(const char *data,
                                 QList<WatchData> *l)
 {
     l->clear();
-    QByteArray fullData = data;
-    fullData.insert(0, '{');
-    fullData.append(data);
-    fullData.append('}');
-    GdbMi root(fullData);
+    GdbMi root;
+    root.fromStringMultiple(QByteArray(data));
     if (!root.isValid())
         return false;
     gbdMiToWatchData(root, GdbMiRecursionContext(), l);
-- 
GitLab