Add 'summary' mode to Value.format_string
authorTom Tromey <tromey@adacore.com>
Tue, 7 Jun 2022 13:05:02 +0000 (07:05 -0600)
committerTom Tromey <tromey@adacore.com>
Fri, 15 Jul 2022 15:26:54 +0000 (09:26 -0600)
This adds a 'summary' mode to Value.format_string and to
gdb.print_options.  For the former, it lets Python code format values
using this mode.  For the latter, it lets a printer potentially detect
if it is being called in a backtrace with 'set print frame-arguments'
set to 'scalars'.

I considered adding a new mode here to let a pretty-printer see
whether it was being called in a 'backtrace' context at all, but I'm
not sure if this is really desirable.

gdb/NEWS
gdb/doc/python.texi
gdb/python/py-prettyprint.c
gdb/python/py-value.c
gdb/testsuite/gdb.python/py-format-string.exp
gdb/testsuite/gdb.python/py-format-string.py

index 85e1e1084579a46fbc0cc243a1569df842b8ec44..4d6de3114110e784b2da2f9687c582897a131b27 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -156,6 +156,10 @@ GNU/Linux/LoongArch (gdbserver)    loongarch*-*-linux*
   ** gdb.Value.format_string now uses the format provided by 'print',
      if it is called during a 'print' or other similar operation.
 
+  ** gdb.Value.format_string now accepts the 'summary' keyword.  This
+     can be used to request a shorter representation of a value, the
+     way that 'set print frame-arguments scalars' does.
+
 * New features in the GDB remote stub, GDBserver
 
   ** GDBserver is now supported on LoongArch GNU/Linux.
index 4573ba677341dee63e94462a5897c2d65b07bd31..5dd907fac42704d6f44bf3ec25eee7f993d9b4c4 100644 (file)
@@ -1160,6 +1160,12 @@ Additionally, @value{GDBN} only styles some value contents, so not
 every output string will contain escape sequences.
 
 When @code{False}, which is the default, no output styling is applied.
+
+@item summary
+@code{True} when just a summary should be printed.  In this mode,
+scalar values are printed in their entirety, but aggregates such as
+structures or unions are omitted.  This mode is used by @code{set
+print frame-arguments scalars} (@pxref{Print Settings}).
 @end table
 @end defun
 
index 4ef45b283f9caa66ea6a7105f72a524e82f2ed1f..7b2aa588bb0370b01aeef7748863d48b6b94c095 100644 (file)
@@ -753,6 +753,8 @@ gdbpy_print_options (PyObject *unused1, PyObject *unused2)
                      opts.static_field_print) < 0
       || set_boolean (result.get (), "deref_refs",
                      opts.deref_ref) < 0
+      || set_boolean (result.get (), "summary",
+                     opts.summary) < 0
       || set_unsigned (result.get (), "max_elements",
                       opts.print_max) < 0
       || set_unsigned (result.get (), "max_depth",
index 93cb9b99edbfc4f2b499b378bbad070c60f68f59..3b75cdaae00730fee564158dce964c950698ea27 100644 (file)
@@ -641,6 +641,7 @@ valpy_format_string (PyObject *self, PyObject *args, PyObject *kw)
       "address",               /* See set print address on|off.  */
       "styling",               /* Should we apply styling.  */
       "nibbles",               /* See set print nibbles on|off.  */
+      "summary",               /* Summary mode for non-scalars.  */
       /* C++ options.  */
       "deref_refs",            /* No corresponding setting.  */
       "actual_objects",                /* See set print object on|off.  */
@@ -690,10 +691,11 @@ valpy_format_string (PyObject *self, PyObject *args, PyObject *kw)
   PyObject *deref_refs_obj = NULL;
   PyObject *actual_objects_obj = NULL;
   PyObject *static_members_obj = NULL;
+  PyObject *summary_obj = NULL;
   char *format = NULL;
   if (!gdb_PyArg_ParseTupleAndKeywords (args,
                                        kw,
-                                       "|O!O!O!O!O!O!O!O!O!O!O!O!IIIs",
+                                       "|O!O!O!O!O!O!O!O!O!O!O!O!O!IIIs",
                                        keywords,
                                        &PyBool_Type, &raw_obj,
                                        &PyBool_Type, &pretty_arrays_obj,
@@ -704,6 +706,7 @@ valpy_format_string (PyObject *self, PyObject *args, PyObject *kw)
                                        &PyBool_Type, &address_obj,
                                        &PyBool_Type, &styling_obj,
                                        &PyBool_Type, &nibbles_obj,
+                                       &PyBool_Type, &summary_obj,
                                        &PyBool_Type, &deref_refs_obj,
                                        &PyBool_Type, &actual_objects_obj,
                                        &PyBool_Type, &static_members_obj,
@@ -736,6 +739,8 @@ valpy_format_string (PyObject *self, PyObject *args, PyObject *kw)
     return NULL;
   if (!copy_py_bool_obj (&opts.static_field_print, static_members_obj))
     return NULL;
+  if (!copy_py_bool_obj (&opts.summary, summary_obj))
+    return nullptr;
 
   /* Numeric arguments for which 0 means unlimited (which we represent as
      UINT_MAX).  Note that the max-depth numeric argument uses -1 as
index 58bbe85f693003f196bea04c8a12989a9c06846a..c432de9727678a61f436b7b567110223c8c7fece 100644 (file)
@@ -1127,6 +1127,12 @@ proc test_print_options {} {
        "print in binary to fetch options"
     gdb_test "python print(saved_options\['format'\] == 't')" "True" \
        "format was set"
+
+    check_format_string "a_point_t" "summary=True" \
+       "No Data" \
+       "print in summary mode"
+    gdb_test "python print(saved_options\['summary'\])" "True" \
+       "summary was set"
 }
 
 # Run all the tests in common for both C and C++.
index aa7b10445cd1d0738a9e8c4e692cdd5593425afe..b7e834625021c335aba05e7d2071482c20ab8bae 100644 (file)
@@ -28,6 +28,8 @@ class PointPrinter(object):
     def to_string(self):
         global saved_options
         saved_options = gdb.print_options()
+        if saved_options["summary"]:
+            return "No Data"
         return "Pretty Point (%s, %s)" % (self.val["x"], self.val["y"])