Handle member pointers directly in generic_value_print
authorTom Tromey <tom@tromey.com>
Wed, 16 Sep 2020 00:44:37 +0000 (18:44 -0600)
committerTom Tromey <tom@tromey.com>
Wed, 16 Sep 2020 00:44:37 +0000 (18:44 -0600)
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.

gdb/ChangeLog
gdb/c-valprint.c
gdb/rust-lang.c
gdb/valprint.c

index 009314a678d6cc90b905d20e9e09226d83567aee..fe4b185e1934b668d133a71e77f12eb12e7294fe 100644 (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.
index eefe6f106bb7ed305a478094ff9fef497e84bbba..01b1071cb70878dc727a3bff70a170c31d03fc0e 100644 (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:
index 0bc65eb15bcf20697fa9cefdde3de653ce71d5e9..fa02b18e6fa1ac010875bfc5fd9105bc64addab6 100644 (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
index d16e9b8bd7cad1d8db16914310a9164490c8bbe8..adfbcc0464b597cb5f6d4f5ae17f7a99d79a424f 100644 (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 ());