From: Tom Tromey <tromey@adacore.com>
To: gdb-patches@sourceware.org
Cc: Tom Tromey <tromey@adacore.com>
Subject: [PATCH 2/2] Add 'summary' mode to Value.format_string
Date: Tue, 7 Jun 2022 09:42:26 -0600 [thread overview]
Message-ID: <20220607154226.3281521-3-tromey@adacore.com> (raw)
In-Reply-To: <20220607154226.3281521-1-tromey@adacore.com>
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 | 2 ++
gdb/doc/python.texi | 6 ++++++
gdb/python/py-prettyprint.c | 2 ++
gdb/python/py-value.c | 7 ++++++-
gdb/testsuite/gdb.python/py-format-string.exp | 6 ++++++
gdb/testsuite/gdb.python/py-format-string.py | 2 ++
6 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/gdb/NEWS b/gdb/NEWS
index 6b32afed82c..114818f0ae4 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -70,6 +70,8 @@ maintenance info line-table
** 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.
+
*** Changes in GDB 12
* DBX mode is deprecated, and will be removed in GDB 13
diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi
index b9b65369db3..bf57a378a60 100644
--- a/gdb/doc/python.texi
+++ b/gdb/doc/python.texi
@@ -1153,6 +1153,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
diff --git a/gdb/python/py-prettyprint.c b/gdb/python/py-prettyprint.c
index 4ef45b283f9..7b2aa588bb0 100644
--- a/gdb/python/py-prettyprint.c
+++ b/gdb/python/py-prettyprint.c
@@ -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",
diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c
index 48acfc8d173..54f9025a60b 100644
--- a/gdb/python/py-value.c
+++ b/gdb/python/py-value.c
@@ -640,6 +640,7 @@ valpy_format_string (PyObject *self, PyObject *args, PyObject *kw)
"unions", /* See set print union on|off. */
"address", /* See set print address on|off. */
"styling", /* Should we apply styling. */
+ "summary", /* Summary mode for non-scalars. */
/* C++ options. */
"deref_refs", /* No corresponding setting. */
"actual_objects", /* See set print object on|off. */
@@ -688,10 +689,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!IIIs",
+ "|O!O!O!O!O!O!O!O!O!O!O!O!IIIs",
keywords,
&PyBool_Type, &raw_obj,
&PyBool_Type, &pretty_arrays_obj,
@@ -701,6 +703,7 @@ valpy_format_string (PyObject *self, PyObject *args, PyObject *kw)
&PyBool_Type, &unions_obj,
&PyBool_Type, &address_obj,
&PyBool_Type, &styling_obj,
+ &PyBool_Type, &summary_obj,
&PyBool_Type, &deref_refs_obj,
&PyBool_Type, &actual_objects_obj,
&PyBool_Type, &static_members_obj,
@@ -731,6 +734,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
diff --git a/gdb/testsuite/gdb.python/py-format-string.exp b/gdb/testsuite/gdb.python/py-format-string.exp
index 0b7cdc18f5f..38794610482 100644
--- a/gdb/testsuite/gdb.python/py-format-string.exp
+++ b/gdb/testsuite/gdb.python/py-format-string.exp
@@ -1054,6 +1054,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++.
diff --git a/gdb/testsuite/gdb.python/py-format-string.py b/gdb/testsuite/gdb.python/py-format-string.py
index aa7b10445cd..8eee211a6ad 100644
--- a/gdb/testsuite/gdb.python/py-format-string.py
+++ b/gdb/testsuite/gdb.python/py-format-string.py
@@ -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"])
--
2.34.1
next prev parent reply other threads:[~2022-06-07 15:42 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-07 15:42 [PATCH 0/2] More introspection for Value.format_string Tom Tromey
2022-06-07 15:42 ` [PATCH 1/2] Expose current 'print' settings to Python Tom Tromey
2022-06-07 16:12 ` Eli Zaretskii
2022-06-07 15:42 ` Tom Tromey [this message]
2022-06-07 16:10 ` [PATCH 2/2] Add 'summary' mode to Value.format_string Eli Zaretskii
2022-07-15 14:45 ` Tom Tromey
2022-07-15 15:24 ` [PATCH 0/2] More introspection for Value.format_string Tom Tromey
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220607154226.3281521-3-tromey@adacore.com \
--to=tromey@adacore.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).