diff options
author | Tom Tromey <tromey@adacore.com> | 2023-06-22 09:00:13 -0600 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2023-07-10 13:17:31 -0600 |
commit | c38bda5104e0011b1255752bec63cb4ffd76449d (patch) | |
tree | d520059a2476bd5089d6e1e0ffbc06feacbe0ee7 | |
parent | 5b86f10883d37e46aeeafa2818e227737d068dff (diff) | |
download | gdb-c38bda5104e0011b1255752bec63cb4ffd76449d.zip gdb-c38bda5104e0011b1255752bec63cb4ffd76449d.tar.gz gdb-c38bda5104e0011b1255752bec63cb4ffd76449d.tar.bz2 |
Handle typedefs in no-op pretty printers
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.
-rw-r--r-- | gdb/python/lib/gdb/printing.py | 23 | ||||
-rw-r--r-- | gdb/testsuite/gdb.dap/scopes.c | 6 |
2 files changed, 15 insertions, 14 deletions
diff --git a/gdb/python/lib/gdb/printing.py b/gdb/python/lib/gdb/printing.py index 353427d..a668bd0 100644 --- a/gdb/python/lib/gdb/printing.py +++ b/gdb/python/lib/gdb/printing.py @@ -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 diff --git a/gdb/testsuite/gdb.dap/scopes.c b/gdb/testsuite/gdb.dap/scopes.c index a9ad4d8..0453f86 100644 --- a/gdb/testsuite/gdb.dap/scopes.c +++ b/gdb/testsuite/gdb.dap/scopes.c @@ -17,13 +17,13 @@ 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; |