aboutsummaryrefslogtreecommitdiff
path: root/gdb/valprint.c
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2020-09-15 18:44:37 -0600
committerTom Tromey <tom@tromey.com>2020-09-15 18:44:37 -0600
commit6b5a7bc768570edc15532759969cd9bff3f02c28 (patch)
tree59a29752067c8019fb858be4bc89a44e6c310be9 /gdb/valprint.c
parentce0e8d978314a2d7e45be442fa0bc76412110ad4 (diff)
downloadgdb-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.c32
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 ());