From: Tom de Vries Date: Tue, 17 Oct 2023 09:38:06 +0000 (+0200) Subject: [gdb/cli] Factor out try_source_highlight X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=62dfd02e30e33be7b6acab5e2e50677d60b8ff8c;p=binutils-gdb.git [gdb/cli] Factor out try_source_highlight Function source_cache::ensure contains some code using the GNU source-highlight library. The code is a sizable part of the function, and contains conditional compilation in a slightly convoluted way: ... if (!already_styled) #endif /* HAVE_SOURCE_HIGHLIGHT */ { ... Fix this by factoring out the code into new function try_source_highlight, such that: - source_cache::ensure is easier to read, and - the conditional compilation is at the level of the function body. Tested on x86_64-linux. Reviewed-By: Lancelot Six --- diff --git a/gdb/source-cache.c b/gdb/source-cache.c index ae02d2516d9..a6b035b513c 100644 --- a/gdb/source-cache.c +++ b/gdb/source-cache.c @@ -191,6 +191,59 @@ get_language_name (enum language lang) #endif /* HAVE_SOURCE_HIGHLIGHT */ +/* Try to highlight CONTENTS from file FULLNAME in language LANG using + the GNU source-higlight library. Return true if highlighting + succeeded. */ + +static bool +try_source_highlight (std::string &contents ATTRIBUTE_UNUSED, + enum language lang ATTRIBUTE_UNUSED, + const std::string &fullname ATTRIBUTE_UNUSED) +{ +#ifdef HAVE_SOURCE_HIGHLIGHT + if (!use_gnu_source_highlight) + return false; + + const char *lang_name = get_language_name (lang); + if (lang_name == nullptr) + return false; + + /* 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; + + bool styled = false; + try + { + if (highlighter == nullptr) + { + highlighter = new srchilite::SourceHighlight ("esc.outlang"); + highlighter->setStyleFile ("esc.style"); + } + + std::istringstream input (contents); + std::ostringstream output; + highlighter->highlight (input, output, lang_name, fullname); + contents = std::move (output).str (); + styled = true; + } + catch (...) + { + /* Source Highlight will throw an exception if + highlighting fails. One possible reason it can fail + is if the language is unknown -- which matters to gdb + because Rust support wasn't added until after 3.1.8. + Ignore exceptions here. */ + } + + return styled; +#else + return false; +#endif /* HAVE_SOURCE_HIGHLIGHT */ +} + /* See source-cache.h. */ bool @@ -230,44 +283,10 @@ source_cache::ensure (struct symtab *s) if (source_styling && gdb_stdout->can_emit_style_escape ()) { -#ifdef HAVE_SOURCE_HIGHLIGHT - bool already_styled = false; - const char *lang_name = get_language_name (s->language ()); - if (lang_name != nullptr && use_gnu_source_highlight) - { - /* 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; - - try - { - if (highlighter == nullptr) - { - highlighter = new srchilite::SourceHighlight ("esc.outlang"); - highlighter->setStyleFile ("esc.style"); - } - - std::istringstream input (contents); - std::ostringstream output; - highlighter->highlight (input, output, lang_name, fullname); - contents = std::move (output).str (); - already_styled = true; - } - catch (...) - { - /* Source Highlight will throw an exception if - highlighting fails. One possible reason it can fail - is if the language is unknown -- which matters to gdb - because Rust support wasn't added until after 3.1.8. - Ignore exceptions here and fall back to - un-highlighted text. */ - } - } + bool already_styled + = try_source_highlight (contents, s->language (), fullname); if (!already_styled) -#endif /* HAVE_SOURCE_HIGHLIGHT */ { gdb::optional ext_contents; ext_contents = ext_lang_colorize (fullname, contents);