From: Tom Tromey Date: Tue, 18 Jun 2019 18:18:24 +0000 (-0600) Subject: Instantiate a single source highlighter X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=dcf3792354ddcd6e10e59e32060e34b27246e7da;p=binutils-gdb.git Instantiate a single source highlighter It occurred to me that there's no reason to make a new source highlighter each time gdb needs to highlight some source code. Instead, a single one can be created and then simply reused each time. This patch implements this idea. Tested on x86-64 Fedora 29. gdb/ChangeLog 2019-06-19 Tom Tromey * source-cache.c (highlighter): New global. (source_cache::get_source_lines): Create a highlighter on demand. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a2abef1c076..55650974cd9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2019-06-19 Tom Tromey + + * source-cache.c (highlighter): New global. + (source_cache::get_source_lines): Create a highlighter on demand. + 2019-06-18 Andrew Burgess * defs.h (deprecated_interactive_hook): Delete declaration. diff --git a/gdb/source-cache.c b/gdb/source-cache.c index 2d5b549d971..86efe83bf9a 100644 --- a/gdb/source-cache.c +++ b/gdb/source-cache.c @@ -197,6 +197,13 @@ 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_with_line_charpos (s)); @@ -209,11 +216,15 @@ source_cache::get_source_lines (struct symtab *s, int first_line, use-after-free. */ fullname = symtab_to_fullname (s); } - srchilite::SourceHighlight highlighter ("esc.outlang"); - highlighter.setStyleFile("esc.style"); + + if (highlighter == nullptr) + { + highlighter = new srchilite::SourceHighlight ("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));