From 6b5a7bc768570edc15532759969cd9bff3f02c28 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Tue, 15 Sep 2020 18:44:37 -0600 Subject: [PATCH] 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 * 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. --- gdb/ChangeLog | 10 ++++++++++ gdb/c-valprint.c | 26 +------------------------- gdb/rust-lang.c | 5 ----- gdb/valprint.c | 32 ++++++++++++++++++++++++++++++-- 4 files changed, 41 insertions(+), 32 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 009314a678d..fe4b185e193 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2020-09-15 Tom Tromey + + * 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 * python/python-internal.h (PyInt_FromLong): Remove define. diff --git a/gdb/c-valprint.c b/gdb/c-valprint.c index eefe6f106bb..01b1071cb70 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 0bc65eb15bc..fa02b18e6fa 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 d16e9b8bd7c..adfbcc0464b 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 ()); -- 2.30.2