public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Tom Tromey <tromey@adacore.com>
To: gdb-patches@sourceware.org
Cc: Tom Tromey <tromey@adacore.com>
Subject: [PATCH 03/14] Use ui_out_redirect_pop in more places
Date: Fri, 12 Aug 2022 18:54:31 -0600	[thread overview]
Message-ID: <20220813005442.4163512-4-tromey@adacore.com> (raw)
In-Reply-To: <20220813005442.4163512-1-tromey@adacore.com>

This changes ui_out_redirect_pop to also perform the redirection, and
then updates several sites to use this, rather than explicit
redirects.
---
 gdb/breakpoint.c           | 13 ++-----------
 gdb/guile/scm-breakpoint.c |  3 +--
 gdb/guile/scm-ports.c      |  3 +--
 gdb/mi/mi-interp.c         | 29 ++++++++---------------------
 gdb/python/py-breakpoint.c |  4 +---
 gdb/top.c                  |  3 +--
 gdb/ui-out.h               |  6 ++++--
 7 files changed, 18 insertions(+), 43 deletions(-)

diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index dae96d205be..0329c1a47c6 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -14049,18 +14049,9 @@ save_breakpoints (const char *filename, int from_tty,
 	{
 	  fp.puts ("  commands\n");
 
-	  current_uiout->redirect (&fp);
-	  try
-	    {
-	      print_command_lines (current_uiout, tp->commands.get (), 2);
-	    }
-	  catch (const gdb_exception &ex)
-	    {
-	    current_uiout->redirect (NULL);
-	      throw;
-	    }
+	  ui_out_redirect_pop redir (current_uiout, &fp);
+	  print_command_lines (current_uiout, tp->commands.get (), 2);
 
-	  current_uiout->redirect (NULL);
 	  fp.puts ("  end\n");
 	}
 
diff --git a/gdb/guile/scm-breakpoint.c b/gdb/guile/scm-breakpoint.c
index 5406b74a389..a7799416c50 100644
--- a/gdb/guile/scm-breakpoint.c
+++ b/gdb/guile/scm-breakpoint.c
@@ -999,10 +999,10 @@ gdbscm_breakpoint_commands (SCM self)
 
   string_file buf;
 
-  current_uiout->redirect (&buf);
   gdbscm_gdb_exception exc {};
   try
     {
+      ui_out_redirect_pop redir (current_uiout, &buf);
       print_command_lines (current_uiout, breakpoint_commands (bp), 0);
     }
   catch (const gdb_exception &except)
@@ -1010,7 +1010,6 @@ gdbscm_breakpoint_commands (SCM self)
       exc = unpack (except);
     }
 
-  current_uiout->redirect (NULL);
   GDBSCM_HANDLE_GDB_EXCEPTION (exc);
   result = gdbscm_scm_from_c_string (buf.c_str ());
 
diff --git a/gdb/guile/scm-ports.c b/gdb/guile/scm-ports.c
index 946859aa1f3..9173cb6f26e 100644
--- a/gdb/guile/scm-ports.c
+++ b/gdb/guile/scm-ports.c
@@ -607,8 +607,7 @@ ioscm_with_output_to_port_worker (SCM port, SCM thunk, enum oport oport,
       gdb_stderr = port_file.get ();
     else
       {
-	current_uiout->redirect (port_file.get ());
-	redirect_popper.emplace (current_uiout);
+	redirect_popper.emplace (current_uiout, port_file.get ());
 
 	gdb_stdout = port_file.get ();
       }
diff --git a/gdb/mi/mi-interp.c b/gdb/mi/mi-interp.c
index ae15177890c..6633a7fa0a8 100644
--- a/gdb/mi/mi-interp.c
+++ b/gdb/mi/mi-interp.c
@@ -816,16 +816,14 @@ mi_tsv_modified (const struct trace_state_variable *tsv)
       gdb_printf (mi->event_channel,
 		  "tsv-modified");
 
-      mi_uiout->redirect (mi->event_channel);
+      ui_out_redirect_pop redir (mi_uiout, mi->event_channel);
 
       mi_uiout->field_string ("name", tsv->name);
       mi_uiout->field_string ("initial",
-			   plongest (tsv->initial_value));
+			      plongest (tsv->initial_value));
       if (tsv->value_known)
 	mi_uiout->field_string ("current", plongest (tsv->value));
 
-      mi_uiout->redirect (NULL);
-
       gdb_flush (mi->event_channel);
     }
 }
@@ -844,7 +842,7 @@ mi_print_breakpoint_for_event (struct mi_interp *mi, breakpoint *bp)
      break if anything is output to mi_uiout prior to calling the
      breakpoint_created notifications.  So, we use
      ui_out_redirect.  */
-  mi_uiout->redirect (mi->event_channel);
+  ui_out_redirect_pop redir (mi_uiout, mi->event_channel);
 
   try
     {
@@ -857,8 +855,6 @@ mi_print_breakpoint_for_event (struct mi_interp *mi, breakpoint *bp)
     {
       exception_print (gdb_stderr, ex);
     }
-
-  mi_uiout->redirect (NULL);
 }
 
 /* Emit notification about a created breakpoint.  */
@@ -1090,12 +1086,10 @@ mi_solib_loaded (struct so_list *solib)
 
       gdb_printf (mi->event_channel, "library-loaded");
 
-      uiout->redirect (mi->event_channel);
+      ui_out_redirect_pop redir (uiout, mi->event_channel);
 
       mi_output_solib_attribs (uiout, solib);
 
-      uiout->redirect (NULL);
-
       gdb_flush (mi->event_channel);
     }
 }
@@ -1118,7 +1112,7 @@ mi_solib_unloaded (struct so_list *solib)
 
       gdb_printf (mi->event_channel, "library-unloaded");
 
-      uiout->redirect (mi->event_channel);
+      ui_out_redirect_pop redir (uiout, mi->event_channel);
 
       uiout->field_string ("id", solib->so_original_name);
       uiout->field_string ("target-name", solib->so_original_name);
@@ -1128,8 +1122,6 @@ mi_solib_unloaded (struct so_list *solib)
 	  uiout->field_fmt ("thread-group", "i%d", current_inferior ()->num);
 	}
 
-      uiout->redirect (NULL);
-
       gdb_flush (mi->event_channel);
     }
 }
@@ -1157,13 +1149,11 @@ mi_command_param_changed (const char *param, const char *value)
 
       gdb_printf (mi->event_channel, "cmd-param-changed");
 
-      mi_uiout->redirect (mi->event_channel);
+      ui_out_redirect_pop redir (mi_uiout, mi->event_channel);
 
       mi_uiout->field_string ("param", param);
       mi_uiout->field_string ("value", value);
 
-      mi_uiout->redirect (NULL);
-
       gdb_flush (mi->event_channel);
     }
 }
@@ -1193,7 +1183,7 @@ mi_memory_changed (struct inferior *inferior, CORE_ADDR memaddr,
 
       gdb_printf (mi->event_channel, "memory-changed");
 
-      mi_uiout->redirect (mi->event_channel);
+      ui_out_redirect_pop redir (mi_uiout, mi->event_channel);
 
       mi_uiout->field_fmt ("thread-group", "i%d", inferior->num);
       mi_uiout->field_core_addr ("addr", target_gdbarch (), memaddr);
@@ -1210,8 +1200,6 @@ mi_memory_changed (struct inferior *inferior, CORE_ADDR memaddr,
 	    mi_uiout->field_string ("type", "code");
 	}
 
-      mi_uiout->redirect (NULL);
-
       gdb_flush (mi->event_channel);
     }
 }
@@ -1243,8 +1231,7 @@ mi_user_selected_context_changed (user_selected_what selection)
 
       mi_uiout = top_level_interpreter ()->interp_ui_out ();
 
-      mi_uiout->redirect (mi->event_channel);
-      ui_out_redirect_pop redirect_popper (mi_uiout);
+      ui_out_redirect_pop redirect_popper (mi_uiout, mi->event_channel);
 
       target_terminal::scoped_restore_terminal_state term_state;
       target_terminal::ours_for_output ();
diff --git a/gdb/python/py-breakpoint.c b/gdb/python/py-breakpoint.c
index 48ec86cebfe..dd4519a1b05 100644
--- a/gdb/python/py-breakpoint.c
+++ b/gdb/python/py-breakpoint.c
@@ -548,19 +548,17 @@ bppy_get_commands (PyObject *self, void *closure)
 
   string_file stb;
 
-  current_uiout->redirect (&stb);
   try
     {
+      ui_out_redirect_pop redir (current_uiout, &stb);
       print_command_lines (current_uiout, breakpoint_commands (bp), 0);
     }
   catch (const gdb_exception &except)
     {
-      current_uiout->redirect (NULL);
       gdbpy_convert_exception (except);
       return NULL;
     }
 
-  current_uiout->redirect (NULL);
   return host_string_to_python_string (stb.c_str ()).release ();
 }
 
diff --git a/gdb/top.c b/gdb/top.c
index 10983919011..655bcd77598 100644
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -735,8 +735,7 @@ execute_fn_to_ui_file (struct ui_file *file, std::function<void(void)> fn)
   scoped_restore save_async = make_scoped_restore (&current_ui->async, 0);
 
   {
-    current_uiout->redirect (file);
-    ui_out_redirect_pop redirect_popper (current_uiout);
+    ui_out_redirect_pop redirect_popper (current_uiout, file);
 
     scoped_restore save_stdout
       = make_scoped_restore (&gdb_stdout, file);
diff --git a/gdb/ui-out.h b/gdb/ui-out.h
index 9e6ff9a29bf..9c455d3ed67 100644
--- a/gdb/ui-out.h
+++ b/gdb/ui-out.h
@@ -427,15 +427,17 @@ class ui_out_emit_table
   struct ui_out *m_uiout;
 };
 
-/* On destruction, pop the last redirection by calling the uiout's
+/* On construction, redirect a uiout to a given stream.  On
+   destruction, pop the last redirection by calling the uiout's
    redirect method with a NULL parameter.  */
 class ui_out_redirect_pop
 {
 public:
 
-  ui_out_redirect_pop (ui_out *uiout)
+  ui_out_redirect_pop (ui_out *uiout, ui_file *stream)
     : m_uiout (uiout)
   {
+    m_uiout->redirect (stream);
   }
 
   ~ui_out_redirect_pop ()
-- 
2.34.1


  parent reply	other threads:[~2022-08-13  0:54 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-08-13  0:54 [PATCH 00/14] Minor ui / interp cleanups Tom Tromey
2022-08-13  0:54 ` [PATCH 01/14] Remove some dead code Tom Tromey
2022-08-13  0:54 ` [PATCH 02/14] Free ui::line_buffer Tom Tromey
2022-08-13  0:54 ` Tom Tromey [this message]
2022-08-13  0:54 ` [PATCH 04/14] Remove the "for moment" comments Tom Tromey
2022-08-13  0:54 ` [PATCH 05/14] Remove obsolete filtering comment Tom Tromey
2022-08-13  0:54 ` [PATCH 06/14] Remove two unused members from mi_interp Tom Tromey
2022-08-13  0:54 ` [PATCH 07/14] Use member initialization in 'struct ui' Tom Tromey
2022-08-13  0:54 ` [PATCH 08/14] Use scoped_restore in safe_parse_type Tom Tromey
2022-08-13  0:54 ` [PATCH 09/14] Remove tui_out_new Tom Tromey
2022-08-13  0:54 ` [PATCH 10/14] Remove a ui-related memory leak Tom Tromey
2022-08-13  0:54 ` [PATCH 11/14] TUI stdout buffering cleanup Tom Tromey
2022-08-13  0:54 ` [PATCH 12/14] Remove a call to clear_interpreter_hooks Tom Tromey
2022-08-13  0:54 ` [PATCH 13/14] Fix "source" with interpreter-exec Tom Tromey
2022-08-13  1:58   ` Enze Li
2022-08-15 17:28     ` Tom Tromey
2022-08-13  0:54 ` [PATCH 14/14] Fix interpreter-exec crash Tom Tromey
2022-08-31 17:13 ` [PATCH 00/14] Minor ui / interp cleanups Tom Tromey

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220813005442.4163512-4-tromey@adacore.com \
    --to=tromey@adacore.com \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).