From ac7b18e8b01e1176eceb2972ac6f0708750fd308 Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Thu, 25 Feb 2010 14:30:43 +0100
Subject: [PATCH] debugger: show structure of nested anonymous structs and
 unions properly

---
 share/qtcreator/gdbmacros/dumper.py | 61 ++++++++++++++++-------------
 1 file changed, 33 insertions(+), 28 deletions(-)

diff --git a/share/qtcreator/gdbmacros/dumper.py b/share/qtcreator/gdbmacros/dumper.py
index 630b99504dc..816ffe957c9 100644
--- a/share/qtcreator/gdbmacros/dumper.py
+++ b/share/qtcreator/gdbmacros/dumper.py
@@ -1165,34 +1165,7 @@ class Dumper:
                         # Anonymous union. We need a dummy name to distinguish
                         # multiple anonymous unions in the struct.
                         anonNumber += 1
-                        iname = "%s.#%d" % (item.iname, anonNumber)
-
-                        #innerType = item.value.type.target()
-                        #self.putType(innerType)
-                        #self.childTypes.append(
-                        #    stripClassTag(str(innerType)))
-                        #self.putItemHelper(
-                        #    Item(item.value.dereference(), item.iname, None, None))
-                        #self.childTypes.pop()
-                        #isHandled = True
-
-                        self.beginHash()
-                        self.putField("iname", iname)
-                        self.putField("name", "#%d" % anonNumber)
-                        self.putField("value", " ")
-                        self.putField("type", "<anonymous union>")
-                        if self.isExpandedIName(iname):
-                            self.beginChildren()
-                            fields = listOfFields(field.type)
-                            for field in fields:
-                                value = item.value[field]
-                                child = Item(value, item.iname, field, field)
-                                self.beginHash()
-                                self.put('addr="%s",' % cleanAddress(value.address))
-                                self.safePutItemHelper(child)
-                                self.endHash();
-                            self.endChildren()
-                        self.endHash()
+                        self.listAnonymous(item, "#%d" % anonNumber, type)
                     else:
                         # Named field.
                         self.beginHash()
@@ -1202,3 +1175,35 @@ class Dumper:
                         self.endHash()
 
                 self.endChildren()
+
+    def listAnonymous(self, item, name, type):
+        anonNumber = 0
+        for field in type.fields():
+            if len(field.name) > 0:
+                value = item.value[field.name]
+                child = Item(value, item.iname, field.name, field.name)
+                self.beginHash()
+                self.put('addr="%s",' % cleanAddress(value.address))
+                self.putItemHelper(child)
+                self.endHash();
+            else:
+                # Further nested.
+                anonNumber += 1
+                name = "#%d" % anonNumber
+                iname = "%s.%s" % (item.iname, name)
+                child = Item(item.value, iname, None, name)
+                self.beginHash()
+                self.putField("name", name)
+                self.putField("value", " ")
+                if str(field.type).endswith("<anonymous union>"):
+                    self.putField("type", "<anonymous union>")
+                elif str(field.type).endswith("<anonymous struct>"):
+                    self.putField("type", "<anonymous struct>")
+                else:
+                    self.putField("type", field.type)
+                self.beginChildren(1)
+                self.listAnonymous(child, name, field.type)
+                self.endChildren()
+                self.endHash()
+
+
-- 
GitLab