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.
This commit is contained in:
Tom Tromey 2020-09-15 18:44:37 -06:00
parent ce0e8d9783
commit 6b5a7bc768
4 changed files with 41 additions and 32 deletions

View File

@ -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.

View File

@ -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:

View File

@ -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

View File

@ -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 ());