Handle typedefs in no-op pretty printers
authorTom Tromey <tromey@adacore.com>
Thu, 22 Jun 2023 15:00:13 +0000 (09:00 -0600)
committerTom Tromey <tromey@adacore.com>
Mon, 10 Jul 2023 19:17:31 +0000 (13:17 -0600)
The no-ops pretty-printers that were introduced for DAP have a classic
gdb bug: they neglect to call check_typedef.  This will cause some
strange behavior; for example not showing the children of a variable
whose type is a typedef of a structure type.  This patch fixes the
oversight.

gdb/python/lib/gdb/printing.py
gdb/testsuite/gdb.dap/scopes.c

index 353427d000a2c0a90c2ccaa7471d519af1d713e5..a668bd0e3fc9e158ce117eb9d739f69ca39b8009 100644 (file)
@@ -282,9 +282,9 @@ class NoOpScalarPrinter:
 class NoOpArrayPrinter:
     """A no-op pretty printer that wraps an array value."""
 
-    def __init__(self, value):
+    def __init__(self, ty, value):
         self.value = value
-        (low, high) = self.value.type.range()
+        (low, high) = ty.range()
         self.low = low
         self.high = high
         # This is a convenience to the DAP code and perhaps other
@@ -305,14 +305,15 @@ class NoOpArrayPrinter:
 class NoOpStructPrinter:
     """A no-op pretty printer that wraps a struct or union value."""
 
-    def __init__(self, value):
+    def __init__(self, ty, value):
+        self.ty = ty
         self.value = value
 
     def to_string(self):
         return ""
 
     def children(self):
-        for field in self.value.type.fields():
+        for field in self.ty.fields():
             if field.name is not None:
                 yield (field.name, self.value[field])
 
@@ -327,14 +328,14 @@ def make_visualizer(value):
     if result is not None:
         # Found a pretty-printer.
         pass
-    elif value.type.code == gdb.TYPE_CODE_ARRAY:
-        result = gdb.printing.NoOpArrayPrinter(value)
-        (low, high) = value.type.range()
-        result.n_children = high - low + 1
-    elif value.type.code in (gdb.TYPE_CODE_STRUCT, gdb.TYPE_CODE_UNION):
-        result = gdb.printing.NoOpStructPrinter(value)
     else:
-        result = gdb.printing.NoOpScalarPrinter(value)
+        ty = value.type.strip_typedefs()
+        if ty.code == gdb.TYPE_CODE_ARRAY:
+            result = gdb.printing.NoOpArrayPrinter(ty, value)
+        elif ty.code in (gdb.TYPE_CODE_STRUCT, gdb.TYPE_CODE_UNION):
+            result = gdb.printing.NoOpStructPrinter(ty, value)
+        else:
+            result = gdb.printing.NoOpScalarPrinter(value)
     return result
 
 
index a9ad4d8a53bbe27bdeb8262e3825f4def95f8a4b..0453f866f7e065b36ebe218b247b1833bc4b4986 100644 (file)
 
 int main ()
 {
-  struct dei_struct
+  typedef struct dei_struct
   {
     int x;
     int more[5];
-  };
+  } dei_type;
 
-  struct dei_struct dei = { 2, { 3, 5, 7, 11, 13 } };
+  dei_type dei = { 2, { 3, 5, 7, 11, 13 } };
 
   static int scalar = 23;