aboutsummaryrefslogtreecommitdiff
path: root/gdb/guile
diff options
context:
space:
mode:
authorKent Cheung <kent.cheung@arm.com>2021-05-13 15:42:20 +0100
committerAndrew Burgess <andrew.burgess@embecosm.com>2021-05-14 06:51:21 +0100
commitecf25064e87a3d2d59871b3ea7126fa0dee0001d (patch)
treeda6aa892b6386531716e8e1b3b33f4168f09d3e4 /gdb/guile
parent64654371d6324794d11131fc95c1bc4caaaf173d (diff)
downloadgdb-ecf25064e87a3d2d59871b3ea7126fa0dee0001d.zip
gdb-ecf25064e87a3d2d59871b3ea7126fa0dee0001d.tar.gz
gdb-ecf25064e87a3d2d59871b3ea7126fa0dee0001d.tar.bz2
gdb: fix pretty printing max depth behaviour
The 'print max-depth' feature incorrectly causes GDB to skip printing the string representation of pretty printed variables if the variable is stored at a nested depth corresponding to the set max-depth value. This change ensures that it is always printed before checking whether the maximum print depth has been reached. Regression tested with GCC 7.3.0 on x86_64, ppc64le, aarch64. gdb/ChangeLog: * cp-valprint.c (cp_print_value): Replaced duplicate code. * guile/scm-pretty-print.c (ppscm_print_children): Check max_depth just before printing child values. (gdbscm_apply_val_pretty_printer): Don't check max_depth before printing string representation. * python/py-prettyprint.c (print_children): Check max_depth just before printing child values. (gdbpy_apply_val_pretty_printer): Don't check max_depth before printing string representation. gdb/testsuite/ChangeLog: * gdb.python/py-format-string.c: Added a variable to test. * gdb.python/py-format-string.exp: Check string representation is printed at appropriate max_depth settings. * gdb.python/py-nested-maps.exp: Likewise. * gdb.guile/scm-pretty-print.exp: Add additional tests.
Diffstat (limited to 'gdb/guile')
-rw-r--r--gdb/guile/scm-pretty-print.c30
1 files changed, 16 insertions, 14 deletions
diff --git a/gdb/guile/scm-pretty-print.c b/gdb/guile/scm-pretty-print.c
index 605615e..2dd7798 100644
--- a/gdb/guile/scm-pretty-print.c
+++ b/gdb/guile/scm-pretty-print.c
@@ -818,21 +818,29 @@ ppscm_print_children (SCM printer, enum display_hint hint,
gdb::unique_xmalloc_ptr<char> name
= gdbscm_scm_to_c_string (scm_name);
- /* Print initial "{". For other elements, there are three cases:
+ /* Print initial "=" to separate print_string_repr output and
+ children. For other elements, there are three cases:
1. Maps. Print a "," after each value element.
2. Arrays. Always print a ",".
3. Other. Always print a ",". */
if (i == 0)
- {
- if (printed_nothing)
- fputs_filtered ("{", stream);
- else
- fputs_filtered (" = {", stream);
- }
-
+ {
+ if (!printed_nothing)
+ fputs_filtered (" = ", stream);
+ }
else if (! is_map || i % 2 == 0)
fputs_filtered (pretty ? "," : ", ", stream);
+ /* Skip printing children if max_depth has been reached. This check
+ is performed after print_string_repr and the "=" separator so that
+ these steps are not skipped if the variable is located within the
+ permitted depth. */
+ if (val_print_check_max_depth (stream, recurse, options, language))
+ goto done;
+ else if (i == 0)
+ /* Print initial "{" to bookend children. */
+ fputs_filtered ("{", stream);
+
/* In summary mode, we just want to print "= {...}" if there is
a value. */
if (options->summary)
@@ -991,12 +999,6 @@ gdbscm_apply_val_pretty_printer (const struct extension_language_defn *extlang,
}
gdb_assert (ppscm_is_pretty_printer_worker (printer));
- if (val_print_check_max_depth (stream, recurse, options, language))
- {
- result = EXT_LANG_RC_OK;
- goto done;
- }
-
/* If we are printing a map, we want some special formatting. */
hint = ppscm_get_display_hint_enum (printer);
if (hint == HINT_ERROR)