X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fsource-cache.c;h=94d82073bccb06a327952794c01540890d6c3355;hb=268a13a5a3f7c6b9b6ffc5ac2d1b24eb41f3fbdc;hp=9211f098eb700c238d8815d6814132a643bf5183;hpb=ab42892fb7d265e72a85e918d4f5c6dfeee3fcd8;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/source-cache.c b/gdb/source-cache.c index 9211f098eb..94d82073bc 100644 --- a/gdb/source-cache.c +++ b/gdb/source-cache.c @@ -18,7 +18,7 @@ #include "defs.h" #include "source-cache.h" -#include "common/scoped_fd.h" +#include "gdbsupport/scoped_fd.h" #include "source.h" #include "cli/cli-style.h" @@ -49,13 +49,10 @@ bool source_cache::get_plain_source_lines (struct symtab *s, int first_line, int last_line, std::string *lines) { - scoped_fd desc (open_source_file (s)); + scoped_fd desc (open_source_file_with_line_charpos (s)); if (desc.get () < 0) return false; - if (s->line_charpos == 0) - find_source_lines (s, desc.get ()); - if (first_line < 1 || first_line > s->nlines || last_line < 1) return false; @@ -181,7 +178,7 @@ source_cache::get_source_lines (struct symtab *s, int first_line, return false; #ifdef HAVE_SOURCE_HIGHLIGHT - if (source_styling && can_emit_style_escape (gdb_stdout)) + if (source_styling && gdb_stdout->can_emit_style_escape ()) { const char *fullname = symtab_to_fullname (s); @@ -200,18 +197,34 @@ source_cache::get_source_lines (struct symtab *s, int first_line, std::ifstream input (fullname); if (input.is_open ()) { + /* The global source highlight object, or null if one + was never constructed. This is stored here rather + than in the class so that we don't need to include + anything or do conditional compilation in + source-cache.h. */ + static srchilite::SourceHighlight *highlighter; + if (s->line_charpos == 0) { - scoped_fd desc = open_source_file (s); + scoped_fd desc (open_source_file_with_line_charpos (s)); if (desc.get () < 0) return false; - find_source_lines (s, desc.get ()); + + /* FULLNAME points to a value owned by the symtab + (symtab::fullname). Calling open_source_file reallocates + that value, so we must refresh FULLNAME to avoid a + use-after-free. */ + fullname = symtab_to_fullname (s); + } + + if (highlighter == nullptr) + { + highlighter = new srchilite::SourceHighlight ("esc.outlang"); + highlighter->setStyleFile ("esc.style"); } - srchilite::SourceHighlight highlighter ("esc.outlang"); - highlighter.setStyleFile("esc.style"); std::ostringstream output; - highlighter.highlight (input, output, lang_name, fullname); + highlighter->highlight (input, output, lang_name, fullname); source_text result = { fullname, output.str () }; m_source_map.push_back (std::move (result));