gdb: Handle requests to print source lines backward
...by which I mean from high line number to low, not, actually
backward character by character!
Commit:
commit 62f29fda90
Date: Tue Oct 9 22:21:05 2018 -0600
Highlight source code using GNU Source Highlight
introduced a regression in the test gdb.linespec/explicit.exp, in
which a request is made to GDB to print a reverse sequence of lines,
from +10 to -10 from the current line number. The expected behaviour
is that GDB prints nothing. The above commit changed this so that GDB
now prints:
Line number 32 out of range; /path/to/gdb/testsuite/gdb.linespec/explicit.c has 71 lines.
which is a little confusing.
This commit fixes the regression, and restores the behaviour that GDB
prints nothing.
While I was passing I noticed a call to `back` on a std::string that I
was concerned could be empty if the request for source lines returns
an empty string. I don't know if it would be possible for a request
for lines to return an empty string, I guess it should be impossible,
in which case, maybe this should be an assertion, but adding a `empty`
check, seems like an easy and cheap safety net.
gdb/ChangeLog:
* source.c (print_source_lines_base): Handle requests to print
reverse line number sequences, and guard against empty lines
string.
This commit is contained in:
parent
62ea19c100
commit
ec98a4ad5b
2 changed files with 17 additions and 1 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
2019-01-08 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||||
|
|
||||||
|
* source.c (print_source_lines_base): Handle requests to print
|
||||||
|
reverse line number sequences, and guard against empty lines
|
||||||
|
string.
|
||||||
|
|
||||||
2019-01-08 Andrew Burgess <andrew.burgess@embecosm.com>
|
2019-01-08 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||||
|
|
||||||
* source.c (print_source_lines_base): Fix skip of '\r' if next
|
* source.c (print_source_lines_base): Fix skip of '\r' if next
|
||||||
|
|
12
gdb/source.c
12
gdb/source.c
|
@ -1346,6 +1346,16 @@ print_source_lines_base (struct symtab *s, int line, int stopline,
|
||||||
|
|
||||||
last_source_error = 0;
|
last_source_error = 0;
|
||||||
|
|
||||||
|
/* If the user requested a sequence of lines that seems to go backward
|
||||||
|
(from high to low line numbers) then we don't print anything.
|
||||||
|
The use of '- 1' here instead of '<=' is currently critical, we rely
|
||||||
|
on the undefined wrap around behaviour of 'int' for stopline. When
|
||||||
|
the use has done: 'set listsize unlimited' then stopline can overflow
|
||||||
|
and appear as MIN_INT. This is a long-standing bug that needs
|
||||||
|
fixing. */
|
||||||
|
if (stopline - 1 < line)
|
||||||
|
return;
|
||||||
|
|
||||||
std::string lines;
|
std::string lines;
|
||||||
if (!g_source_cache.get_source_lines (s, line, stopline - 1, &lines))
|
if (!g_source_cache.get_source_lines (s, line, stopline - 1, &lines))
|
||||||
error (_("Line number %d out of range; %s has %d lines."),
|
error (_("Line number %d out of range; %s has %d lines."),
|
||||||
|
@ -1392,7 +1402,7 @@ print_source_lines_base (struct symtab *s, int line, int stopline,
|
||||||
if (c == '\0')
|
if (c == '\0')
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (lines.back () != '\n')
|
if (!lines.empty() && lines.back () != '\n')
|
||||||
uiout->text ("\n");
|
uiout->text ("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue