Allow pretty-print of static members
authorTom Tromey <tom@tromey.com>
Sat, 22 Apr 2023 00:53:48 +0000 (18:53 -0600)
committerTom Tromey <tom@tromey.com>
Sat, 6 May 2023 16:38:31 +0000 (10:38 -0600)
Python pretty-printers haven't applied to static members for quite
some time.  I tracked this down to the call to cp_print_value_fields
in cp_print_static_field -- it doesn't let pretty-printers have a
chance to print the value.  This patch fixes the problem.

The way that static members are handled is very weird to me.  I tend
to think this should be done more globally, like in value_print.
However, I haven't made any big change.

Reviewed-by: Keith Seitz <keiths@redhat.com>
Tested-by: Keith Seitz <keiths@redhat.com>
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30057

gdb/cp-valprint.c
gdb/testsuite/gdb.python/py-prettyprint.c
gdb/testsuite/gdb.python/py-prettyprint.exp

index 8fad9523a7e5ae8384ce9d899915a4d5e6f238e9..0ad14b43527af4a78ea3962bff7cf82ce600e7ee 100644 (file)
@@ -381,6 +381,32 @@ cp_print_value_fields (struct value *val, struct ui_file *stream,
   gdb_printf (stream, "}");
 }
 
+/* A wrapper for cp_print_value_fields that tries to apply a
+   pretty-printer first.  */
+
+static void
+cp_print_value_fields_pp (struct value *val,
+                         struct ui_file *stream,
+                         int recurse,
+                         const struct value_print_options *options,
+                         struct type **dont_print_vb,
+                         int dont_print_statmem)
+{
+  int result = 0;
+
+  /* Attempt to run an extension language pretty-printer if
+     possible.  */
+  if (!options->raw)
+    result
+      = apply_ext_lang_val_pretty_printer (val, stream,
+                                          recurse, options,
+                                          current_language);
+
+  if (!result)
+    cp_print_value_fields (val, stream, recurse, options, dont_print_vb,
+                          dont_print_statmem);
+}
+
 /* Special val_print routine to avoid printing multiple copies of
    virtual baseclasses.  */
 
@@ -493,27 +519,16 @@ cp_print_value (struct value *val, struct ui_file *stream,
        val_print_invalid_address (stream);
       else
        {
-         int result = 0;
-
          if (!val_print_check_max_depth (stream, recurse, options,
                                          current_language))
            {
              struct value *baseclass_val = val->primitive_field (0,
                                                                  i, type);
 
-             /* Attempt to run an extension language pretty-printer on the
-                baseclass if possible.  */
-             if (!options->raw)
-               result
-                 = apply_ext_lang_val_pretty_printer (baseclass_val, stream,
-                                                      recurse, options,
-                                                      current_language);
-
-             if (!result)
-               cp_print_value_fields (baseclass_val, stream, recurse, options,
-                                      ((struct type **)
-                                       obstack_base (&dont_print_vb_obstack)),
-                                      0);
+             cp_print_value_fields_pp
+               (baseclass_val, stream, recurse, options,
+                (struct type **) obstack_base (&dont_print_vb_obstack),
+                0);
            }
        }
       gdb_puts (", ", stream);
@@ -581,7 +596,7 @@ cp_print_static_field (struct type *type,
 
       obstack_grow (&dont_print_statmem_obstack, (char *) &addr,
                    sizeof (CORE_ADDR));
-      cp_print_value_fields (val, stream, recurse, options, NULL, 1);
+      cp_print_value_fields_pp (val, stream, recurse, options, nullptr, 1);
       return;
     }
 
index 0832f4b545b8e4cac119ccf373c5da0ec32b64ad..7697a5312a8d89193ae4c3936e51a00e5a36f732 100644 (file)
@@ -110,6 +110,14 @@ class Fake
   {
   }
 };
+
+struct has_static_member
+{
+  static s global;
+};
+
+s has_static_member::global;
+
 #endif
 
 struct to_string_returns_value_inner
@@ -356,6 +364,9 @@ main ()
   Derived derived;
   
   Fake fake (42);
+
+  init_s (&has_static_member::global, 23);
+  has_static_member has_member;
 #endif
 
   add_item (&c, 23);           /* MI breakpoint here */
index b7661ff14ed0136c0d579c353ceeb67054bcf96d..05507cba9c9712c10062b67bb9e7ed36e3ad60c6 100644 (file)
@@ -82,6 +82,11 @@ proc run_lang_tests {exefile lang} {
        gdb_test "print ns" "embedded\\\\000n\.\.\.." \
            "print ns with element limit of 10"
        gdb_test_no_output "set print elements 200"
+
+       gdb_test "print has_member" \
+           "=  a=<23> b=<$hex <has_static_member::global>>.*"
+       gdb_test "print has_static_member::global" \
+           "=  a=<23> b=<$hex <has_static_member::global>>"
     }
 
     if { ![is_address_zero_readable] } {