[gdb/cli] Factor out try_source_highlight
authorTom de Vries <tdevries@suse.de>
Tue, 17 Oct 2023 09:38:06 +0000 (11:38 +0200)
committerTom de Vries <tdevries@suse.de>
Tue, 17 Oct 2023 09:38:06 +0000 (11:38 +0200)
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 <lancelot.six@amd.com>
gdb/source-cache.c

index ae02d2516d9601cb691c60e0d2f0aa756e89d624..a6b035b513cad29c960042ca8bbbd2a5f90e55f2 100644 (file)
@@ -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<std::string> ext_contents;
          ext_contents = ext_lang_colorize (fullname, contents);