Remove make_cleanup_ui_out_redirect_pop

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.
This commit is contained in:
Tom Tromey 2017-08-13 10:47:32 -06:00
parent e6a2252ac3
commit ca5909c7de
7 changed files with 65 additions and 48 deletions

View File

@ -1,3 +1,15 @@
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.

View File

@ -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);

View File

@ -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)

View File

@ -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);
{
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);
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);
execute_command (p, from_tty);
}
do_cleanups (cleanup);

View File

@ -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 */

View File

@ -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)
{

View File

@ -205,10 +205,6 @@ private:
/* 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 *));