diff options
author | Tom Tromey <tom@tromey.com> | 2023-04-21 18:53:48 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2023-05-06 10:38:31 -0600 |
commit | 3c0e312054aa6c46f0efba0ab111f83f0ea4caed (patch) | |
tree | c3ee6a6e98cdcaa13490496d35a7749c39eb987c /gdb | |
parent | 973f18b57cc1c7ba343d02bf766d3b51dedc111b (diff) | |
download | binutils-3c0e312054aa6c46f0efba0ab111f83f0ea4caed.zip binutils-3c0e312054aa6c46f0efba0ab111f83f0ea4caed.tar.gz binutils-3c0e312054aa6c46f0efba0ab111f83f0ea4caed.tar.bz2 |
Allow pretty-print of static members
Python pretty-printers haven't applied to static members for quite
some time. I tracked this down to the call to cp_print_value_fields
in cp_print_static_field -- it doesn't let pretty-printers have a
chance to print the value. This patch fixes the problem.
The way that static members are handled is very weird to me. I tend
to think this should be done more globally, like in value_print.
However, I haven't made any big change.
Reviewed-by: Keith Seitz <keiths@redhat.com>
Tested-by: Keith Seitz <keiths@redhat.com>
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30057
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/cp-valprint.c | 47 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/py-prettyprint.c | 11 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/py-prettyprint.exp | 5 |
3 files changed, 47 insertions, 16 deletions
diff --git a/gdb/cp-valprint.c b/gdb/cp-valprint.c index 8fad952..0ad14b4 100644 --- a/gdb/cp-valprint.c +++ b/gdb/cp-valprint.c @@ -381,6 +381,32 @@ cp_print_value_fields (struct value *val, struct ui_file *stream, gdb_printf (stream, "}"); } +/* A wrapper for cp_print_value_fields that tries to apply a + pretty-printer first. */ + +static void +cp_print_value_fields_pp (struct value *val, + struct ui_file *stream, + int recurse, + const struct value_print_options *options, + struct type **dont_print_vb, + int dont_print_statmem) +{ + int result = 0; + + /* Attempt to run an extension language pretty-printer if + possible. */ + if (!options->raw) + result + = apply_ext_lang_val_pretty_printer (val, stream, + recurse, options, + current_language); + + if (!result) + cp_print_value_fields (val, stream, recurse, options, dont_print_vb, + dont_print_statmem); +} + /* Special val_print routine to avoid printing multiple copies of virtual baseclasses. */ @@ -493,27 +519,16 @@ cp_print_value (struct value *val, struct ui_file *stream, val_print_invalid_address (stream); else { - int result = 0; - if (!val_print_check_max_depth (stream, recurse, options, current_language)) { struct value *baseclass_val = val->primitive_field (0, i, type); - /* Attempt to run an extension language pretty-printer on the - baseclass if possible. */ - if (!options->raw) - result - = apply_ext_lang_val_pretty_printer (baseclass_val, stream, - recurse, options, - current_language); - - if (!result) - cp_print_value_fields (baseclass_val, stream, recurse, options, - ((struct type **) - obstack_base (&dont_print_vb_obstack)), - 0); + cp_print_value_fields_pp + (baseclass_val, stream, recurse, options, + (struct type **) obstack_base (&dont_print_vb_obstack), + 0); } } gdb_puts (", ", stream); @@ -581,7 +596,7 @@ cp_print_static_field (struct type *type, obstack_grow (&dont_print_statmem_obstack, (char *) &addr, sizeof (CORE_ADDR)); - cp_print_value_fields (val, stream, recurse, options, NULL, 1); + cp_print_value_fields_pp (val, stream, recurse, options, nullptr, 1); return; } diff --git a/gdb/testsuite/gdb.python/py-prettyprint.c b/gdb/testsuite/gdb.python/py-prettyprint.c index 0832f4b..7697a53 100644 --- a/gdb/testsuite/gdb.python/py-prettyprint.c +++ b/gdb/testsuite/gdb.python/py-prettyprint.c @@ -110,6 +110,14 @@ class Fake { } }; + +struct has_static_member +{ + static s global; +}; + +s has_static_member::global; + #endif struct to_string_returns_value_inner @@ -356,6 +364,9 @@ main () Derived derived; Fake fake (42); + + init_s (&has_static_member::global, 23); + has_static_member has_member; #endif add_item (&c, 23); /* MI breakpoint here */ diff --git a/gdb/testsuite/gdb.python/py-prettyprint.exp b/gdb/testsuite/gdb.python/py-prettyprint.exp index b7661ff..05507cb 100644 --- a/gdb/testsuite/gdb.python/py-prettyprint.exp +++ b/gdb/testsuite/gdb.python/py-prettyprint.exp @@ -82,6 +82,11 @@ proc run_lang_tests {exefile lang} { gdb_test "print ns" "embedded\\\\000n\.\.\.." \ "print ns with element limit of 10" gdb_test_no_output "set print elements 200" + + gdb_test "print has_member" \ + "= a=<23> b=<$hex <has_static_member::global>>.*" + gdb_test "print has_static_member::global" \ + "= a=<23> b=<$hex <has_static_member::global>>" } if { ![is_address_zero_readable] } { |