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 | |
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')
-rw-r--r-- | gdb/ChangeLog | 10 | ||||
-rw-r--r-- | gdb/c-valprint.c | 26 | ||||
-rw-r--r-- | gdb/rust-lang.c | 5 | ||||
-rw-r--r-- | gdb/valprint.c | 32 |
4 files changed, 41 insertions, 32 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 009314a..fe4b185 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +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. + 2020-09-15 Tom Tromey <tromey@adacore.com> * python/python-internal.h (PyInt_FromLong): Remove define. diff --git a/gdb/c-valprint.c b/gdb/c-valprint.c index eefe6f1..01b1071 100644 --- a/gdb/c-valprint.c +++ b/gdb/c-valprint.c @@ -416,23 +416,6 @@ c_value_print_int (struct value *val, struct ui_file *stream, } } -/* c_value_print helper for TYPE_CODE_MEMBERPTR. */ - -static void -c_value_print_memberptr (struct value *val, struct ui_file *stream, - int recurse, - const struct value_print_options *options) -{ - if (!options->format) - { - 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, &c_decorations); -} - /* See c-lang.h. */ void @@ -440,7 +423,6 @@ c_value_print_inner (struct value *val, struct ui_file *stream, int recurse, const struct value_print_options *options) { struct type *type = value_type (val); - const gdb_byte *valaddr = value_contents_for_printing (val); type = check_typedef (type); switch (type->code ()) @@ -449,10 +431,6 @@ c_value_print_inner (struct value *val, struct ui_file *stream, int recurse, c_value_print_array (val, stream, recurse, options); break; - case TYPE_CODE_METHODPTR: - cplus_print_method_ptr (valaddr, type, stream); - break; - case TYPE_CODE_PTR: c_value_print_ptr (val, stream, recurse, options); break; @@ -466,10 +444,8 @@ c_value_print_inner (struct value *val, struct ui_file *stream, int recurse, c_value_print_int (val, stream, options); break; + case TYPE_CODE_METHODPTR: case TYPE_CODE_MEMBERPTR: - c_value_print_memberptr (val, stream, recurse, options); - break; - case TYPE_CODE_REF: case TYPE_CODE_RVALUE_REF: case TYPE_CODE_ENUM: diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c index 0bc65eb..fa02b18 100644 --- a/gdb/rust-lang.c +++ b/gdb/rust-lang.c @@ -535,11 +535,6 @@ rust_value_print_inner (struct value *val, struct ui_file *stream, } goto generic_print; - case TYPE_CODE_METHODPTR: - case TYPE_CODE_MEMBERPTR: - c_value_print_inner (val, stream, recurse, &opts); - break; - case TYPE_CODE_INT: /* Recognize the unit type. */ if (type->is_unsigned () && TYPE_LENGTH (type) == 0 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 ()); |