Add 'summary' mode to Value.format_string
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.
This commit is contained in:
parent
c4a3dbaf11
commit
72be9d6be7
4
gdb/NEWS
4
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.
|
||||
|
@ -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
|
||||
|
||||
|
@ -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",
|
||||
|
@ -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
|
||||
|
@ -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++.
|
||||
|
@ -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"])
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user