[RFA 6/7] Remove make_cleanup_ui_out_redirect_pop

Tom Tromey
2017-09-09T15:35:58Z

This patch introduces ui_out_redirect_pop. All uses of
make_cleanup_ui_out_redirect_pop are replaced with this new class.

ChangeLog
2017-09-09 Tom Tromey <tom@tromey.com>

* mi/mi-interp.c (mi_user_selected_context_changed): Use
ui_out_redirect_pop.
* guile/scm-ports.c (ioscm_with_output_to_port_worker): Use
ui_out_redirect_pop.
* utils.c (do_ui_out_redirect_pop)
(make_cleanup_ui_out_redirect_pop): Remove.
* top.c (execute_command_to_string): Use ui_out_redirect_pop.
* utils.h (make_cleanup_ui_out_redirect_pop): Remove.
* ui-out.h (ui_out_redirect_pop): New class.
---
gdb/ChangeLog | 12 ++++++++++++
gdb/guile/scm-ports.c | 22 +++++++++++++---------
gdb/mi/mi-interp.c | 5 ++---
gdb/top.c | 32 +++++++++++++++++---------------
gdb/ui-out.h | 23 +++++++++++++++++++++++
gdb/utils.c | 19 -------------------
gdb/utils.h | 4 ----
7 files changed, 67 insertions(+), 50 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index a8c1642..cc8e4e4 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,17 @@
2017-09-09 Tom Tromey <tom@tromey.com>

+ * mi/mi-interp.c (mi_user_selected_context_changed): Use
+ ui_out_redirect_pop.
+ * guile/scm-ports.c (ioscm_with_output_to_port_worker): Use
+ ui_out_redirect_pop.
+ * utils.c (do_ui_out_redirect_pop)
+ (make_cleanup_ui_out_redirect_pop): Remove.
+ * top.c (execute_command_to_string): Use ui_out_redirect_pop.
+ * utils.h (make_cleanup_ui_out_redirect_pop): Remove.
+ * ui-out.h (ui_out_redirect_pop): New class.
+
+2017-09-09 Tom Tromey <tom@tromey.com>
+
* mi/mi-main.c (output_cores): Use ui_out_emit_list.
(list_available_thread_groups, mi_cmd_list_thread_groups)
(mi_cmd_data_list_changed_registers, mi_cmd_data_read_memory)
diff --git a/gdb/guile/scm-ports.c b/gdb/guile/scm-ports.c
index 735abc2..78187c4 100644
--- a/gdb/guile/scm-ports.c
+++ b/gdb/guile/scm-ports.c
@@ -26,6 +26,7 @@
#include "top.h"
#include "target.h"
#include "guile-internal.h"
+#include "common/gdb_optional.h"

#ifdef HAVE_POLL
#if defined (HAVE_POLL_H)
@@ -477,17 +478,20 @@ ioscm_with_output_to_port_worker (SCM port, SCM thunk, enum oport oport,
scoped_restore save_file = make_scoped_restore (oport == GDB_STDERR
? &gdb_stderr : &gdb_stdout);

- if (oport == GDB_STDERR)
- gdb_stderr = port_file.get ();
- else
- {
- current_uiout->redirect (port_file.get ());
- make_cleanup_ui_out_redirect_pop (current_uiout);
+ {
+ gdb::optional<ui_out_redirect_pop> redirect_popper;
+ if (oport == GDB_STDERR)
+ gdb_stderr = port_file.get ();
+ else
+ {
+ current_uiout->redirect (port_file.get ());
+ redirect_popper.emplace (current_uiout);

- gdb_stdout = port_file.get ();
- }
+ gdb_stdout = port_file.get ();
+ }

- result = gdbscm_safe_call_0 (thunk, NULL);
+ result = gdbscm_safe_call_0 (thunk, NULL);
+ }

do_cleanups (cleanups);

diff --git a/gdb/mi/mi-interp.c b/gdb/mi/mi-interp.c
index 6b6d8f0..1331860 100644
--- a/gdb/mi/mi-interp.c
+++ b/gdb/mi/mi-interp.c
@@ -1314,10 +1314,9 @@ mi_user_selected_context_changed (user_selected_what selection)
mi_uiout = interp_ui_out (top_level_interpreter ());

mi_uiout->redirect (mi->event_channel);
+ ui_out_redirect_pop redirect_popper (mi_uiout);

- old_chain = make_cleanup_ui_out_redirect_pop (mi_uiout);
-
- make_cleanup_restore_target_terminal ();
+ old_chain = make_cleanup_restore_target_terminal ();
target_terminal_ours_for_output ();

if (selection & USER_SELECTED_INFERIOR)
diff --git a/gdb/top.c b/gdb/top.c
index a4fd262..742c1e7 100644
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -679,21 +679,23 @@ execute_command_to_string (char *p, int from_tty)

string_file str_file;

- current_uiout->redirect (&str_file);
- make_cleanup_ui_out_redirect_pop (current_uiout);
-
- scoped_restore save_stdout
- = make_scoped_restore (&gdb_stdout, &str_file);
- scoped_restore save_stderr
- = make_scoped_restore (&gdb_stderr, &str_file);
- scoped_restore save_stdlog
- = make_scoped_restore (&gdb_stdlog, &str_file);
- scoped_restore save_stdtarg
- = make_scoped_restore (&gdb_stdtarg, &str_file);
- scoped_restore save_stdtargerr
- = make_scoped_restore (&gdb_stdtargerr, &str_file);
-
- execute_command (p, from_tty);
+ {
+ current_uiout->redirect (&str_file);
+ ui_out_redirect_pop redirect_popper (current_uiout);
+
+ scoped_restore save_stdout
+ = make_scoped_restore (&gdb_stdout, &str_file);
+ scoped_restore save_stderr
+ = make_scoped_restore (&gdb_stderr, &str_file);
+ scoped_restore save_stdlog
+ = make_scoped_restore (&gdb_stdlog, &str_file);
+ scoped_restore save_stdtarg
+ = make_scoped_restore (&gdb_stdtarg, &str_file);
+ scoped_restore save_stdtargerr
+ = make_scoped_restore (&gdb_stdtargerr, &str_file);
+
+ execute_command (p, from_tty);
+ }

do_cleanups (cleanup);

diff --git a/gdb/ui-out.h b/gdb/ui-out.h
index d983837..9ed2bd2 100644
--- a/gdb/ui-out.h
+++ b/gdb/ui-out.h
@@ -242,4 +242,27 @@ private:
struct ui_out *m_uiout;
};

+/* 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)
+ : m_uiout (uiout)
+ {
+ }
+
+ ~ui_out_redirect_pop ()
+ {
+ m_uiout->redirect (NULL);
+ }
+
+ ui_out_redirect_pop (const ui_out_redirect_pop &) = delete;
+ ui_out_redirect_pop &operator= (const ui_out_redirect_pop &) = delete;
+
+private:
+ struct ui_out *m_uiout;
+};
+
#endif /* UI_OUT_H */
diff --git a/gdb/utils.c b/gdb/utils.c
index f2da2df..1941e7c 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -137,25 +137,6 @@ show_pagination_enabled (struct ui_file *file, int from_tty,
because while they use the "cleanup API" they are not part of the
"cleanup API". */

-/* Helper function for make_cleanup_ui_out_redirect_pop. */
-
-static void
-do_ui_out_redirect_pop (void *arg)
-{
- struct ui_out *uiout = (struct ui_out *) arg;
-
- uiout->redirect (NULL);
-}
-
-/* Return a new cleanup that pops the last redirection by ui_out_redirect
- with NULL parameter. */
-
-struct cleanup *
-make_cleanup_ui_out_redirect_pop (struct ui_out *uiout)
-{
- return make_cleanup (do_ui_out_redirect_pop, uiout);
-}
-
static void
do_free_section_addr_info (void *arg)
{
diff --git a/gdb/utils.h b/gdb/utils.h
index 1c8b95c..6d33e8d 100644
--- a/gdb/utils.h
+++ b/gdb/utils.h
@@ -205,10 +205,6 @@ private:
\f
/* Cleanup utilities. */

-struct ui_out;
-extern struct cleanup *
- make_cleanup_ui_out_redirect_pop (struct ui_out *uiout);
-
struct section_addr_info;
extern struct cleanup *(make_cleanup_free_section_addr_info
(struct section_addr_info *));
--
2.9.4