+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.
#include "top.h"
#include "target.h"
#include "guile-internal.h"
+#include "common/gdb_optional.h"
#ifdef HAVE_POLL
#if defined (HAVE_POLL_H)
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);
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)
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);
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 */
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)
{
\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 *));