[gdb/tui] Don't show line number for lines not in source file

Message ID 20230515035824.13645-1-tdevries@suse.de
State Committed
Headers
Series [gdb/tui] Don't show line number for lines not in source file |

Commit Message

Tom de Vries May 15, 2023, 3:58 a.m. UTC
  Currently, for a source file containing only 5 lines, we also show line
numbers 6 and 7 if they're in scope of the source window:
...
    0 +-compact-source.c----------------+
    1 |___3_{                           |
    2 |___4_  return 0;                 |
    3 |___5_}                           |
    4 |___6_                            |
    5 |___7_                            |
    6 +---------------------------------+
...

Fix this by not showing line numbers not in a source file, such that we have instead:
...
    0 +-compact-source.c----------------+
    1 |___3_{                           |
    2 |___4_  return 0;                 |
    3 |___5_}                           |
    4 |                                 |
    5 |                                 |
    6 +---------------------------------+
...

Tested on x86_64-linux.
---
 gdb/testsuite/gdb.tui/compact-source.exp | 28 ++++++++++--------------
 gdb/testsuite/lib/tuiterm.exp            |  8 +++++++
 gdb/tui/tui-source.c                     | 24 +++++++++++++++-----
 3 files changed, 39 insertions(+), 21 deletions(-)


base-commit: 0d5ffd658faf6920c99405b6b68d6046f10c845f
  

Comments

Tom Tromey May 16, 2023, 3:10 p.m. UTC | #1
>>>>> "Tom" == Tom de Vries via Gdb-patches <gdb-patches@sourceware.org> writes:

Tom> Currently, for a source file containing only 5 lines, we also show line
Tom> numbers 6 and 7 if they're in scope of the source window:

Makes sense to me.

Approved-By: Tom Tromey <tom@tromey.com>

Tom
  

Patch

diff --git a/gdb/testsuite/gdb.tui/compact-source.exp b/gdb/testsuite/gdb.tui/compact-source.exp
index f972d961d72..e9703b3c3d9 100644
--- a/gdb/testsuite/gdb.tui/compact-source.exp
+++ b/gdb/testsuite/gdb.tui/compact-source.exp
@@ -53,22 +53,18 @@  if {![Term::enter_tui]} {
 
 set re_border "\\|"
 
-foreach_with_prefix src_window_size {7 8} {
-    set src_window_lines [expr $src_window_size - 2]
-    set max_line_nr_in_source_file [llength $src_list]
-    set max_line_nr_in_source_window \
-	[expr $max_line_nr_in_source_file + $src_window_lines - 1]
+set max_line_nr_in_source_file [llength $src_list]
+# Ensure there are more lines in the window than in the source file.
+set src_window_lines [expr $max_line_nr_in_source_file + 2]
+# Account for border size.
+set src_window_size [expr $src_window_lines + 2]
+Term::command "wh src $src_window_size"
 
-    Term::command "wh src $src_window_size"
+set re_left_margin "___4_"
 
-    if { $max_line_nr_in_source_window == 9 } {
-	set re_left_margin "___4_"
-    } elseif { $max_line_nr_in_source_window == 10 }  {
-	set re_left_margin "___04_"
-    } else {
-	error "unhandled max_line_nr_in_source_window"
-    }
+Term::check_contents "compact source format" \
+    "$re_border$re_left_margin$re_line_four *$re_border"
 
-    Term::check_contents "compact source format" \
-	"$re_border$re_left_margin$re_line_four *$re_border"
-}
+set re_left_margin "___0*[expr $max_line_nr_in_source_file + 1]_"
+Term::check_contents_not "no surplus line number" \
+    "$re_border$re_left_margin *$re_border"
diff --git a/gdb/testsuite/lib/tuiterm.exp b/gdb/testsuite/lib/tuiterm.exp
index 5e4235da942..195f14666f4 100644
--- a/gdb/testsuite/lib/tuiterm.exp
+++ b/gdb/testsuite/lib/tuiterm.exp
@@ -1004,6 +1004,14 @@  namespace eval Term {
 	gdb_assert {[regexp -- $regexp $contents]} $test_name
     }
 
+    # As check_contents, but check that the text contents of the terminal does
+    # not match the regular expression.
+    proc check_contents_not {test_name regexp} {
+	dump_screen
+	set contents [get_all_lines]
+	gdb_assert {![regexp -- $regexp $contents]} $test_name
+    }
+
     # Get the region of the screen described by X, Y, WIDTH,
     # and HEIGHT, and separate the lines using SEP.
     proc get_region { x y width height sep } {
diff --git a/gdb/tui/tui-source.c b/gdb/tui/tui-source.c
index 9d0376000de..55cde258882 100644
--- a/gdb/tui/tui-source.c
+++ b/gdb/tui/tui-source.c
@@ -80,7 +80,7 @@  tui_source_window::set_contents (struct gdbarch *arch,
       /* Solaris 11+gcc 5.5 has ambiguous overloads of log10, so we
 	 cast to double to get the right one.  */
       int lines_in_file = offsets->size ();
-      int max_line_nr = lines_in_file + nlines - 1;
+      int max_line_nr = lines_in_file;
       int digits_needed = 1 + (int)log10 ((double) max_line_nr);
       int trailing_space = 1;
       m_digits = digits_needed + trailing_space;
@@ -100,6 +100,11 @@  tui_source_window::set_contents (struct gdbarch *arch,
 	  text = tui_copy_source_line (&iter, &line_len);
 	  m_max_length = std::max (m_max_length, line_len);
 	}
+      else
+	{
+	  /* Line not in source file.  */
+	  cur_line_no = -1;
+	}
 
       /* Set whether element is the execution point
 	 and whether there is a break point on it.  */
@@ -233,11 +238,20 @@  tui_source_window::display_start_addr (struct gdbarch **gdbarch_p,
 void
 tui_source_window::show_line_number (int offset) const
 {
-  int lineno = m_content[0].line_or_addr.u.line_no + offset;
+  int lineno = m_content[offset].line_or_addr.u.line_no;
   char text[20];
   char space = tui_left_margin_verbose ? '_' : ' ';
-  xsnprintf (text, sizeof (text),
-	     tui_left_margin_verbose ? "%0*d%c" : "%*d%c", m_digits - 1,
-	     lineno, space);
+  if (lineno == -1)
+    {
+      /* Line not in source file, don't show line number.  */
+      for (int i = 0; i <= m_digits; ++i)
+	text[i] = (i == m_digits) ? '\0' : space;
+    }
+  else
+    {
+      xsnprintf (text, sizeof (text),
+		 tui_left_margin_verbose ? "%0*d%c" : "%*d%c", m_digits - 1,
+		 lineno, space);
+    }
   waddstr (handle.get (), text);
 }