From ef9db9cf79ff72fd9484cb406db84e6cbe02c4b5 Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Fri, 4 Dec 2009 13:22:39 +0100
Subject: [PATCH] debugger: make 'watch' item work with new dumpers

---
 share/qtcreator/gdbmacros/dumper.py    | 53 ++++++++++++++++++++------
 src/plugins/debugger/gdb/gdbengine.cpp | 16 ++++++--
 src/plugins/debugger/watchhandler.cpp  | 16 +++++---
 src/plugins/debugger/watchhandler.h    |  1 +
 4 files changed, 67 insertions(+), 19 deletions(-)

diff --git a/share/qtcreator/gdbmacros/dumper.py b/share/qtcreator/gdbmacros/dumper.py
index 944c7b5a730..bec8ed71710 100644
--- a/share/qtcreator/gdbmacros/dumper.py
+++ b/share/qtcreator/gdbmacros/dumper.py
@@ -6,6 +6,7 @@
 import sys
 import traceback
 import gdb
+import base64
 import curses.ascii
 
 verbosity = 0
@@ -195,10 +196,11 @@ class FrameCommand(gdb.Command):
         passExceptions = int(args[1])
         expandedINames = set()
         if len(args) > 2:
-            expandedINames = set(args[2].split(','))
-        watchers = set()
+            expandedINames = set(args[2].split(","))
+        watchers = ()
         if len(args) > 3:
-            watchers = set(args[3].split(','))
+            #watchers = set(args[3].split(','))
+            watchers = base64.b64decode(args[3]).split("$")
         #warn("EXPANDED INAMES: %s" % expandedINames)
         #warn("WATCHERS: %s" % watchers)
         module = sys.modules[__name__]
@@ -222,24 +224,31 @@ class FrameCommand(gdb.Command):
             print output
             return
   
+
         if useFancy:
             for key, value in module.__dict__.items():
                 #if callable(value):
                 if key.startswith("qqDump"):
                     self.dumpers[key[6:]] = value
-        try:
-            frame = gdb.selected_frame()
-        except RuntimeError:
-            return ""
 
         d = Dumper()
         d.dumpers = self.dumpers
         d.passExceptions = passExceptions
         d.ns = qtNamespace()
-        block = frame.block()
+        d.expandedINames = expandedINames
+        d.useFancy = useFancy
         #warn(" NAMESPACE IS: '%s'" % d.ns)
-        #warn("FRAME %s: " % frame)
 
+        #
+        # Locals
+        #
+        try:
+            frame = gdb.selected_frame()
+            #warn("FRAME %s: " % frame)
+        except RuntimeError:
+            return ""
+
+        block = frame.block()
         while True:
             if block is None:
                 warn("UNEXPECTED 'None' BLOCK")
@@ -263,8 +272,6 @@ class FrameCommand(gdb.Command):
                     continue
                 #warn("ITEM %s: " % item.value)
 
-                d.expandedINames = expandedINames
-                d.useFancy = useFancy
                 d.beginHash()
                 d.put('iname="%s",' % item.iname)
                 d.safePutItemHelper(item)
@@ -278,6 +285,30 @@ class FrameCommand(gdb.Command):
             block = block.superblock
             #warn("BLOCK %s: " % block)
 
+        #
+        # Watchers
+        #
+        watcherCount = 0
+        for watcher in watchers:
+            warn("HANDLING WATCH %s" % watcher)
+            name = str(watcherCount)
+            try:
+                value = gdb.parse_and_eval(watcher)
+                item = Item(value), "watch", name, name)
+                warn(" VALUE %s" % item.value)
+                d.beginHash()
+                d.put('iname="%s",' % item.iname)
+                d.safePutItemHelper(item)
+                d.endHash()
+            else:
+                d.beginHash()
+                d.put('iname="watch.%d",' % watcherCount)
+                d.put('name="%s",' % watcher)
+                d.put('value="<invalid>",' % watcherCount)
+                d.put('type=<unknown>,numchild="0"')
+                d.endHash()
+            watcherCount += 1
+
         d.pushOutput()
 
         print('locals={iname="local",name="Locals",value=" ",type=" ",'
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 85688780f61..bc7ee0ddd44 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -3543,10 +3543,20 @@ void GdbEngine::updateLocals(const QVariant &cookie)
         m_processedNames.clear();
         manager()->watchHandler()->beginCycle();
         m_toolTipExpression.clear();
-        QStringList expanded = m_manager->watchHandler()->expandedINames().toList();
-        postCommand(_("-interpreter-exec console \"bb %1 0 %2\"")
+        WatchHandler *handler = m_manager->watchHandler();
+        QStringList expanded = handler->expandedINames().toList();
+        QString watchers;
+        foreach (QString item, handler->watchedExpressions()) {
+            if (!watchers.isEmpty())
+                watchers += _("$");
+            //item.replace(_("\""), _("\\\""));
+            watchers += item;
+        }
+
+        postCommand(_("-interpreter-exec console \"bb %1 0 %2 %3\"")
                 .arg(int(theDebuggerBoolSetting(UseDebuggingHelpers)))
-                .arg(expanded.join(_(","))),
+                .arg(expanded.join(_(",")))
+                .arg(_(watchers.toLatin1().toBase64())),
             CB(handleStackFrame));
     } else {
         m_processedNames.clear();
diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp
index 86399746221..fdcae7dda21 100644
--- a/src/plugins/debugger/watchhandler.cpp
+++ b/src/plugins/debugger/watchhandler.cpp
@@ -644,7 +644,8 @@ static QString formattedValue(const WatchData &data,
 
 bool WatchModel::canFetchMore(const QModelIndex &index) const
 {
-    return !m_inExtraLayoutChanged && index.isValid() && !m_fetchTriggered.contains(watchItem(index)->iname);
+    return !m_inExtraLayoutChanged && index.isValid()
+        && !m_fetchTriggered.contains(watchItem(index)->iname);
 }
 
 void WatchModel::fetchMore(const QModelIndex &index)
@@ -1389,10 +1390,9 @@ void WatchHandler::loadWatchers()
     //reinitializeWatchersHelper();
 }
 
-void WatchHandler::saveWatchers()
+QStringList WatchHandler::watchedExpressions() const
 {
-    //qDebug() << "SAVE WATCHERS: " << m_watchers;
-    // Filter out valid watchers.
+    // Filter out invalid watchers.
     QStringList watcherNames;
     QHashIterator<QString, int> it(m_watcherNames);
     while (it.hasNext()) {
@@ -1401,7 +1401,13 @@ void WatchHandler::saveWatchers()
         if (!watcherName.isEmpty() && watcherName != watcherEditPlaceHolder())
             watcherNames.push_back(watcherName);
     }
-    m_manager->setSessionValue("Watchers", QVariant(watcherNames));
+    return watcherNames;
+}
+
+void WatchHandler::saveWatchers()
+{
+    //qDebug() << "SAVE WATCHERS: " << m_watchers;
+    m_manager->setSessionValue("Watchers", QVariant(watchedExpressions()));
 }
 
 void WatchHandler::loadTypeFormats()
diff --git a/src/plugins/debugger/watchhandler.h b/src/plugins/debugger/watchhandler.h
index f0b31c03ead..50852d3838c 100644
--- a/src/plugins/debugger/watchhandler.h
+++ b/src/plugins/debugger/watchhandler.h
@@ -274,6 +274,7 @@ public:
         { return m_expandedINames.contains(iname); }
     QSet<QString> expandedINames() const
         { return m_expandedINames; }
+    QStringList watchedExpressions() const;
 
     static QString watcherEditPlaceHolder();
 
-- 
GitLab