+2016-07-25 Simon Marchi <simon.marchi@ericsson.com>
+
+ * top.h (make_delete_ui_cleanup): New declaration.
+ * top.c (delete_ui_cleanup): New function.
+ (make_delete_ui_cleanup): New function.
+ (new_ui_command): Create restore_ui cleanup earlier, create a
+ delete_ui cleanup and discard it on success.
+
2016-07-25 Pedro Alves <palves@redhat.com>
Jan Kratochvil <jan.kratochvil@redhat.com>
}
}
-do_test
+# Test missing / invalid arguments.
+
+proc do_test_invalid_args {} {
+ global testfile
+
+ clean_restart $testfile
+
+ spawn -pty
+ set extra_tty_name $spawn_out(slave,name)
+
+ # Test bad terminal path.
+ gdb_test "new-ui console /non/existent/path" \
+ "opening terminal failed: No such file or directory\." \
+ "new-ui with bad terminal path"
+
+ # Test bad interpreter name.
+ gdb_test "new-ui bloop $extra_tty_name" \
+ "Interpreter `bloop' unrecognized" \
+ "new-ui with bad interpreter name"
+
+ # Test that we can continue working normally.
+ if ![runto_main] {
+ fail "could not run to main"
+ }
+}
+
+with_test_prefix "do_test" do_test
+with_test_prefix "do_test_invalid_args" do_test_invalid_args
free_ui (ui);
}
+/* Cleanup that deletes a UI. */
+
+static void
+delete_ui_cleanup (void *void_ui)
+{
+ struct ui *ui = (struct ui *) void_ui;
+
+ delete_ui (ui);
+}
+
+/* See top.h. */
+
+struct cleanup *
+make_delete_ui_cleanup (struct ui *ui)
+{
+ return make_cleanup (delete_ui_cleanup, ui);
+}
+
/* Open file named NAME for read/write, making sure not to make it the
controlling terminal. */
char **argv;
const char *interpreter_name;
const char *tty_name;
- struct cleanup *back_to;
- struct cleanup *streams_chain;
+ struct cleanup *success_chain;
+ struct cleanup *failure_chain;
dont_repeat ();
argv = gdb_buildargv (args);
- back_to = make_cleanup_freeargv (argv);
+ success_chain = make_cleanup_freeargv (argv);
argc = countargv (argv);
if (argc < 2)
interpreter_name = argv[0];
tty_name = argv[1];
- streams_chain = make_cleanup (null_cleanup, NULL);
+ make_cleanup (restore_ui_cleanup, current_ui);
+
+ failure_chain = make_cleanup (null_cleanup, NULL);
/* Open specified terminal, once for each of
stdin/stdout/stderr. */
}
ui = new_ui (stream[0], stream[1], stream[2]);
-
- discard_cleanups (streams_chain);
+ make_cleanup (delete_ui_cleanup, ui);
ui->async = 1;
- make_cleanup (restore_ui_cleanup, current_ui);
current_ui = ui;
set_top_level_interpreter (interpreter_name);
interp_pre_command_loop (top_level_interpreter ());
- /* This restores the previous UI. */
- do_cleanups (back_to);
+ discard_cleanups (failure_chain);
+
+ /* This restores the previous UI and frees argv. */
+ do_cleanups (success_chain);
printf_unfiltered ("New UI allocated\n");
}
extern struct ui *new_ui (FILE *instream, FILE *outstream, FILE *errstream);
extern void delete_ui (struct ui *todel);
+/* Cleanup that deletes a UI. */
+extern struct cleanup *make_delete_ui_cleanup (struct ui *ui);
+
/* Cleanup that restores the current UI. */
extern void restore_ui_cleanup (void *data);