diff options
author | Tom Tromey <tom@tromey.com> | 2020-09-15 18:44:37 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2020-09-15 18:44:37 -0600 |
commit | 6b5a7bc768570edc15532759969cd9bff3f02c28 (patch) | |
tree | 59a29752067c8019fb858be4bc89a44e6c310be9 /gdb/valprint.c | |
parent | ce0e8d978314a2d7e45be442fa0bc76412110ad4 (diff) | |
download | gdb-6b5a7bc768570edc15532759969cd9bff3f02c28.zip gdb-6b5a7bc768570edc15532759969cd9bff3f02c28.tar.gz gdb-6b5a7bc768570edc15532759969cd9bff3f02c28.tar.bz2 |
Handle member pointers directly in generic_value_print
TYPE_CODE_MEMBERPTR and TYPE_CODE_METHODPTR are only used for C++, so
it seems to me that the generic value-printing code ought to handle
these cases -- that way, printing these objects will work even when
the current language is not C++. This patch implements this idea.
gdb/ChangeLog
2020-09-15 Tom Tromey <tom@tromey.com>
* rust-lang.c (rust_value_print_inner): Remove TYPE_CODE_MEMBERPTR
and TYPE_CODE_METHODPTR cases.
* c-valprint.c (c_value_print_memberptr): Move to valprint.c.
(c_value_print_inner): Update.
* valprint.c (generic_value_print_memberptr): New function, from
c_value_print_memberptr.
(generic_value_print): Use it. Call cplus_print_method_ptr.
Diffstat (limited to 'gdb/valprint.c')
-rw-r--r-- | gdb/valprint.c | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/gdb/valprint.c b/gdb/valprint.c index d16e9b8..adfbcc0 100644 --- a/gdb/valprint.c +++ b/gdb/valprint.c @@ -40,6 +40,8 @@ #include "gdbarch.h" #include "cli/cli-style.h" #include "count-one-bits.h" +#include "c-lang.h" +#include "cp-abi.h" /* Maximum number of wchars returned from wchar_iterate. */ #define MAX_WCHARS 4 @@ -811,6 +813,27 @@ generic_value_print_complex (struct value *val, struct ui_file *stream, fprintf_filtered (stream, "%s", decorations->complex_suffix); } +/* generic_value_print helper for TYPE_CODE_MEMBERPTR. */ + +static void +generic_value_print_memberptr + (struct value *val, struct ui_file *stream, + int recurse, + const struct value_print_options *options, + const struct generic_val_print_decorations *decorations) +{ + if (!options->format) + { + /* Member pointers are essentially specific to C++, and so if we + encounter one, we should print it according to C++ rules. */ + struct type *type = check_typedef (value_type (val)); + const gdb_byte *valaddr = value_contents_for_printing (val); + cp_print_class_member (valaddr, type, stream, "&"); + } + else + generic_value_print (val, stream, recurse, options, decorations); +} + /* See valprint.h. */ void @@ -828,7 +851,8 @@ generic_value_print (struct value *val, struct ui_file *stream, int recurse, break; case TYPE_CODE_MEMBERPTR: - value_print_scalar_formatted (val, options, 0, stream); + generic_value_print_memberptr (val, stream, recurse, options, + decorations); break; case TYPE_CODE_PTR: @@ -914,9 +938,13 @@ generic_value_print (struct value *val, struct ui_file *stream, int recurse, generic_value_print_complex (val, stream, options, decorations); break; + case TYPE_CODE_METHODPTR: + cplus_print_method_ptr (value_contents_for_printing (val), type, + stream); + break; + case TYPE_CODE_UNION: case TYPE_CODE_STRUCT: - case TYPE_CODE_METHODPTR: default: error (_("Unhandled type code %d in symbol table."), type->code ()); |