Re: [patch] Fix uiout for execute_command_to_string

Jan Kratochvil
2010-09-11T16:01:59Z

On Fri, 10 Sep 2010 22:27:27 +0200, Tom Tromey wrote:
> >>>>> "Jan" == Jan Kratochvil <jan.kratochvil@redhat.com> writes:
> Jan> +struct cleanup *
> Jan> +make_cleanup_ui_out_redirect_pop (struct ui_out *uiout)
> Jan> +{
> Jan> + return make_my_cleanup (&cleanup_chain, do_ui_out_redirect_pop, uiout);
> Jan> +}
>
> The two new functions need header comments.

Done.

> Ok with that change.

Checked-in.

Thanks,
Jan

http://sourceware.org/ml/gdb-cvs/2010-09/msg00080.html

--- src/gdb/ChangeLog 2010/09/10 16:17:11 1.12170
+++ src/gdb/ChangeLog 2010/09/11 16:00:20 1.12171
@@ -1,3 +1,21 @@
+2010-09-11 Jan Kratochvil <jan.kratochvil@redhat.com>
+ Paul Bolle <pebolle@tiscali.nl>
+
+ Redirect also uiout and stdtarg{,err} in execute_command_to_string.
+ * cli-logging.c (struct saved_output_files) <targerr>: New.
+ (set_logging_redirect, pop_output_files, handle_redirections):
+ Redirect also gdb_stdtargerr.
+ * defs.h (struct ui_out, make_cleanup_ui_out_redirect_pop): New
+ declarations.
+ * event-top.c (gdb_setup_readline, gdb_disable_readline): Redirect
+ also gdb_stdtargerr.
+ * top.c (execute_command_to_string): Move make_cleanup_ui_file_delete
+ to the top. Redirect also gdb_stdlog, gdb_stdtarg and gdb_stdtargerr.
+ Use ui_out_redirect, register make_cleanup_ui_out_redirect_pop.
+ * tui/tui-io.c (tui_setup_io): Redirect also gdb_stdtargerr.
+ * utils.c (do_ui_out_redirect_pop, make_cleanup_ui_out_redirect_pop):
+ New functions.
+
2010-09-10 Pierre Muller <muller@ics.u-strasbg.fr>

* hppa-tdep.c (unwind_command): Use host_address_to_string function
--- src/gdb/testsuite/ChangeLog 2010/09/10 20:29:25 1.2444
+++ src/gdb/testsuite/ChangeLog 2010/09/11 16:00:26 1.2445
@@ -1,3 +1,8 @@
+2010-09-11 Jan Kratochvil <jan.kratochvil@redhat.com>
+
+ * gdb.python/python.exp (set height 0, collect help from uiout)
+ (verify help to uiout): New tests.
+
2010-09-10 Edjunior Barbosa Machado <emachado@linux.vnet.ibm.com>

* gdb.base/break-interp.exp (test_ld) <istarget powerpc64-*>: Add
--- src/gdb/defs.h 2010/08/31 18:08:43 1.278
+++ src/gdb/defs.h 2010/09/11 16:00:25 1.279
@@ -337,6 +337,10 @@
struct ui_file;
extern struct cleanup *make_cleanup_ui_file_delete (struct ui_file *);

+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 *));
--- src/gdb/event-top.c 2010/06/26 06:44:47 1.72
+++ src/gdb/event-top.c 2010/09/11 16:00:25 1.73
@@ -1048,6 +1048,7 @@
gdb_stderr = stdio_fileopen (stderr);
gdb_stdlog = gdb_stderr; /* for moment */
gdb_stdtarg = gdb_stderr; /* for moment */
+ gdb_stdtargerr = gdb_stderr; /* for moment */

/* If the input stream is connected to a terminal, turn on
editing. */
@@ -1106,6 +1107,7 @@
ui_file_delete (gdb_stderr);
gdb_stdlog = NULL;
gdb_stdtarg = NULL;
+ gdb_stdtargerr = NULL;
#endif

rl_callback_handler_remove ();
--- src/gdb/top.c 2010/08/07 15:00:37 1.183
+++ src/gdb/top.c 2010/09/11 16:00:25 1.184
@@ -475,12 +475,23 @@

str_file = mem_fileopen ();

+ make_cleanup_ui_file_delete (str_file);
make_cleanup_restore_ui_file (&gdb_stdout);
make_cleanup_restore_ui_file (&gdb_stderr);
- make_cleanup_ui_file_delete (str_file);
+ make_cleanup_restore_ui_file (&gdb_stdlog);
+ make_cleanup_restore_ui_file (&gdb_stdtarg);
+ make_cleanup_restore_ui_file (&gdb_stdtargerr);
+
+ if (ui_out_redirect (uiout, str_file) < 0)
+ warning (_("Current output protocol does not support redirection"));
+ else
+ make_cleanup_ui_out_redirect_pop (uiout);

gdb_stdout = str_file;
gdb_stderr = str_file;
+ gdb_stdlog = str_file;
+ gdb_stdtarg = str_file;
+ gdb_stdtargerr = str_file;

execute_command (p, from_tty);

--- src/gdb/utils.c 2010/08/07 15:00:37 1.239
+++ src/gdb/utils.c 2010/09/11 16:00:25 1.240
@@ -311,6 +311,26 @@
return make_my_cleanup (&cleanup_chain, do_ui_file_delete, arg);
}

+/* Helper function for make_cleanup_ui_out_redirect_pop. */
+
+static void
+do_ui_out_redirect_pop (void *arg)
+{
+ struct ui_out *uiout = arg;
+
+ if (ui_out_redirect (uiout, NULL) < 0)
+ warning (_("Cannot restore redirection of the current output protocol"));
+}
+
+/* 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_my_cleanup (&cleanup_chain, do_ui_out_redirect_pop, uiout);
+}
+
static void
do_free_section_addr_info (void *arg)
{
--- src/gdb/cli/cli-logging.c 2010/09/03 15:42:03 1.25
+++ src/gdb/cli/cli-logging.c 2010/09/11 16:00:26 1.26
@@ -33,6 +33,7 @@
struct ui_file *err;
struct ui_file *log;
struct ui_file *targ;
+ struct ui_file *targerr;
};
static struct saved_output_files saved_output;
static char *saved_filename;
@@ -116,6 +117,7 @@
gdb_stderr = output;
gdb_stdlog = output;
gdb_stdtarg = output;
+ gdb_stdtargerr = output;
logging_no_redirect_file = new_logging_no_redirect_file;

/* There is a former output pushed on the ui_out_redirect stack. We want to
@@ -154,10 +156,12 @@
gdb_stderr = saved_output.err;
gdb_stdlog = saved_output.log;
gdb_stdtarg = saved_output.targ;
+ gdb_stdtargerr = saved_output.targ;
saved_output.out = NULL;
saved_output.err = NULL;
saved_output.log = NULL;
saved_output.targ = NULL;
+ saved_output.targerr = NULL;

ui_out_redirect (uiout, NULL);
}
@@ -211,11 +215,13 @@
saved_output.err = gdb_stderr;
saved_output.log = gdb_stdlog;
saved_output.targ = gdb_stdtarg;
+ saved_output.targerr = gdb_stdtargerr;

gdb_stdout = output;
gdb_stderr = output;
gdb_stdlog = output;
gdb_stdtarg = output;
+ gdb_stdtargerr = output;

if (ui_out_redirect (uiout, output) < 0)
warning (_("Current output protocol does not support redirection"));
--- src/gdb/testsuite/gdb.python/python.exp 2010/08/19 17:00:58 1.14
+++ src/gdb/testsuite/gdb.python/python.exp 2010/09/11 16:00:27 1.15
@@ -149,6 +149,12 @@
}
gdb_test "q" "Quit" "verify pagination afterwards: q"

+gdb_test_no_output "set height 0"
+
+gdb_test_no_output "python a = gdb.execute('help', to_string=True)" "collect help from uiout"
+
+gdb_test "python print a" ".*aliases -- Aliases of other commands.*" "verify help to uiout"
+
# Start with a fresh gdb.
clean_restart ${testfile}

--- src/gdb/tui/tui-io.c 2010/07/28 11:56:30 1.24
+++ src/gdb/tui/tui-io.c 2010/09/11 16:00:27 1.25
@@ -545,6 +545,7 @@
gdb_stderr = tui_stderr;
gdb_stdlog = gdb_stdout; /* for moment */
gdb_stdtarg = gdb_stderr; /* for moment */
+ gdb_stdtargerr = gdb_stderr; /* for moment */
uiout = tui_out;

/* Save tty for SIGCONT. */
@@ -557,6 +558,7 @@
gdb_stderr = tui_old_stderr;
gdb_stdlog = gdb_stdout; /* for moment */
gdb_stdtarg = gdb_stderr; /* for moment */
+ gdb_stdtargerr = gdb_stderr; /* for moment */
uiout = tui_old_uiout;

/* Restore readline. */