aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorAndrew Burgess <aburgess@redhat.com>2022-01-24 15:29:49 +0000
committerAndrew Burgess <aburgess@redhat.com>2022-02-07 16:52:47 +0000
commit0642912e83168b9036d81e8a9950352d233affcb (patch)
treededd33995145b8d2ba8e2d863ad3231a68d22907 /gdb
parent573269a87c89ae866db556428fe9ea63d6c4db5f (diff)
downloadgdb-0642912e83168b9036d81e8a9950352d233affcb.zip
gdb-0642912e83168b9036d81e8a9950352d233affcb.tar.gz
gdb-0642912e83168b9036d81e8a9950352d233affcb.tar.bz2
gdb/python: allow Value.format_string to return styled output
Add a new argument to the gdb.Value.format_string method, 'styling'. This argument is False by default. When this argument is True, then the returned string can contain output styling escape sequences. When this argument is False, then the returned string will not contain any styling escape sequences. If the returned string is going to be printed to the user, then it is often nice to retain the GDB styling. For the testing, we need to adjust the TERM environment variable, as we do for all the styling tests. I'm now running all of the C tests in gdb.python/py-format-string.exp in an environment where styling could be generated, but only my new test should actually produce styled output, hopefully this will catch the case where a bug might cause format_string to always produce styled output.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/NEWS7
-rw-r--r--gdb/doc/python.texi10
-rw-r--r--gdb/python/py-value.c7
-rw-r--r--gdb/testsuite/gdb.python/py-format-string.exp20
4 files changed, 39 insertions, 5 deletions
diff --git a/gdb/NEWS b/gdb/NEWS
index c739930..b4a5151 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -168,6 +168,13 @@ info win
manager that temporarily sets the gdb parameter NAME to VALUE,
then resets it when the context is exited.
+ ** The gdb.Value.format_string method now takes a 'styling'
+ argument, which is a boolean. When true, the returned string can
+ include escape sequences to apply styling. The styling will only
+ be present if styling is otherwise turned on in GDB (see 'help
+ set styling'). When false, which is the default if the argument
+ is not given, then no styling is applied to the returned string.
+
* New features in the GDB remote stub, GDBserver
** GDBserver is now supported on OpenRISC GNU/Linux.
diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi
index da88b8a..c1a3f5f 100644
--- a/gdb/doc/python.texi
+++ b/gdb/doc/python.texi
@@ -1079,6 +1079,16 @@ A string containing a single character representing the format to use for
the returned string. For instance, @code{'x'} is equivalent to using the
@value{GDBN} command @code{print} with the @code{/x} option and formats
the value as a hexadecimal number.
+
+@item styling
+@code{True} if @value{GDBN} should apply styling to the returned
+string. When styling is applied, the returned string might contain
+ANSI terminal escape sequences. Escape sequences will only be
+included if styling is turned on, see @ref{Output Styling}.
+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.
@end table
@end defun
diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c
index 6401d96..b546344 100644
--- a/gdb/python/py-value.c
+++ b/gdb/python/py-value.c
@@ -639,6 +639,7 @@ valpy_format_string (PyObject *self, PyObject *args, PyObject *kw)
"symbols", /* See set print symbol on|off. */
"unions", /* See set print union on|off. */
"address", /* See set print address on|off. */
+ "styling", /* Should we apply styling. */
/* C++ options. */
"deref_refs", /* No corresponding setting. */
"actual_objects", /* See set print object on|off. */
@@ -683,13 +684,14 @@ valpy_format_string (PyObject *self, PyObject *args, PyObject *kw)
PyObject *symbols_obj = NULL;
PyObject *unions_obj = NULL;
PyObject *address_obj = NULL;
+ PyObject *styling_obj = Py_False;
PyObject *deref_refs_obj = NULL;
PyObject *actual_objects_obj = NULL;
PyObject *static_members_obj = NULL;
char *format = NULL;
if (!gdb_PyArg_ParseTupleAndKeywords (args,
kw,
- "|O!O!O!O!O!O!O!O!O!O!IIIs",
+ "|O!O!O!O!O!O!O!O!O!O!O!IIIs",
keywords,
&PyBool_Type, &raw_obj,
&PyBool_Type, &pretty_arrays_obj,
@@ -698,6 +700,7 @@ valpy_format_string (PyObject *self, PyObject *args, PyObject *kw)
&PyBool_Type, &symbols_obj,
&PyBool_Type, &unions_obj,
&PyBool_Type, &address_obj,
+ &PyBool_Type, &styling_obj,
&PyBool_Type, &deref_refs_obj,
&PyBool_Type, &actual_objects_obj,
&PyBool_Type, &static_members_obj,
@@ -752,7 +755,7 @@ valpy_format_string (PyObject *self, PyObject *args, PyObject *kw)
}
}
- string_file stb;
+ string_file stb (PyObject_IsTrue (styling_obj));
try
{
diff --git a/gdb/testsuite/gdb.python/py-format-string.exp b/gdb/testsuite/gdb.python/py-format-string.exp
index 4c78bed..ac1353e 100644
--- a/gdb/testsuite/gdb.python/py-format-string.exp
+++ b/gdb/testsuite/gdb.python/py-format-string.exp
@@ -991,6 +991,13 @@ proc_with_prefix test_invalid_args {} {
"ValueError: a single character is required.*"
}
+# Check the styling argument to format_string. This function needs to
+# be called with TERM set such that styling can be applied.
+proc test_styling {} {
+ gdb_test "python print(gdb.parse_and_eval(\"a_point_t\").format_string(styling=True, raw=True))" \
+ "{[style x variable] = 42, [style y variable] = 12}"
+}
+
# Run all the tests in common for both C and C++.
proc_with_prefix test_all_common {} {
# No options.
@@ -1023,9 +1030,16 @@ with_test_prefix "format_string" {
# Perform C Tests.
if { [build_inferior "${binfile}" "c"] == 0 } {
with_test_prefix "lang_c" {
- set current_lang "c"
- prepare_gdb "${binfile}"
- test_all_common
+ save_vars { env(TERM) } {
+ # We run all of these tests in an environment where styling
+ # could work, but we only expect the final call to
+ # test_styling to actually produce any styled output.
+ setenv TERM ansi
+ set current_lang "c"
+ prepare_gdb "${binfile}"
+ test_all_common
+ test_styling
+ }
}
}