void init (bool top_level) override;
void resume () override;
void suspend () override;
- gdb_exception exec (const char *command_str) override;
+ void exec (const char *command_str) override;
ui_out *interp_ui_out () override;
private:
return dynamic_cast<cli_interp_base *> (interp);
}
-/* Longjmp-safe wrapper for "execute_command". */
-static struct gdb_exception safe_execute_command (struct ui_out *uiout,
- const char *command,
- int from_tty);
-
/* See cli-interp.h.
Breakpoint hits should always be mirrored to a console. Deciding
gdb_disable_readline ();
}
-gdb_exception
+void
cli_interp::exec (const char *command_str)
{
- struct ui_file *old_stream;
- struct gdb_exception result;
-
/* gdb_stdout could change between the time m_cli_uiout was
initialized and now. Since we're probably using a different
interpreter which has a new ui_file for gdb_stdout, use that one
It is important that it gets reset everytime, since the user
could set gdb to use a different interpreter. */
- old_stream = m_cli_uiout->set_stream (gdb_stdout);
- result = safe_execute_command (m_cli_uiout.get (), command_str, 1);
- m_cli_uiout->set_stream (old_stream);
- return result;
-}
-
-bool
-cli_interp_base::supports_command_editing ()
-{
- return true;
-}
-
-static struct gdb_exception
-safe_execute_command (struct ui_out *command_uiout, const char *command,
- int from_tty)
-{
- struct gdb_exception e;
+ ui_file *old_stream = m_cli_uiout->set_stream (gdb_stdout);
+ SCOPE_EXIT { m_cli_uiout->set_stream (old_stream); };
/* Save and override the global ``struct ui_out'' builder. */
scoped_restore saved_uiout = make_scoped_restore (¤t_uiout,
- command_uiout);
+ m_cli_uiout.get ());
try
{
- execute_command (command, from_tty);
+ execute_command (command_str, 1);
}
- catch (gdb_exception &exception)
+ catch (const gdb_exception_error &ex)
{
- e = std::move (exception);
+ exception_print (gdb_stderr, ex);
+ throw;
}
+}
- /* FIXME: cagney/2005-01-13: This shouldn't be needed. Instead the
- caller should print the exception. */
- exception_print (gdb_stderr, e);
- return e;
+bool
+cli_interp_base::supports_command_editing ()
+{
+ return true;
}
ui_out *
#include "top.h" /* For command_loop. */
#include "main.h"
#include "gdbsupport/buildargv.h"
+#include "gdbsupport/scope-exit.h"
/* Each UI has its own independent set of interpreters. */
/* interp_exec - This executes COMMAND_STR in the current
interpreter. */
-struct gdb_exception
+void
interp_exec (struct interp *interp, const char *command_str)
{
struct ui_interp_info *ui_interp = get_current_interp_info ();
scoped_restore save_command_interp
= make_scoped_restore (&ui_interp->command_interpreter, interp);
- return interp->exec (command_str);
+ interp->exec (command_str);
}
/* A convenience routine that nulls out all the common command hooks.
error (_("Could not find interpreter \"%s\"."), prules[0]);
interp_set (interp_to_use, false);
-
- for (i = 1; i < nrules; i++)
+ SCOPE_EXIT
{
- struct gdb_exception e = interp_exec (interp_to_use, prules[i]);
-
- if (e.reason < 0)
- {
- interp_set (old_interp, 0);
- error (_("error in command: \"%s\"."), prules[i]);
- }
- }
+ interp_set (old_interp, false);
+ };
- interp_set (old_interp, 0);
+ for (i = 1; i < nrules; i++)
+ interp_exec (interp_to_use, prules[i]);
}
/* See interps.h. */
extern void interp_factory_register (const char *name,
interp_factory_func func);
-extern struct gdb_exception interp_exec (struct interp *interp,
- const char *command);
+extern void interp_exec (struct interp *interp, const char *command);
class interp
{
virtual void resume () = 0;
virtual void suspend () = 0;
- virtual gdb_exception exec (const char *command) = 0;
+ virtual void exec (const char *command) = 0;
/* Returns the ui_out currently used to collect results for this
interpreter. It can be a formatter for stdout, as is the case
gdb_disable_readline ();
}
-gdb_exception
+void
mi_interp::exec (const char *command)
{
mi_execute_command_wrapper (command);
- return gdb_exception ();
}
void
};
for (i = 1; i < argc; i++)
- {
- struct gdb_exception e = interp_exec (interp_to_use, argv[i]);
-
- if (e.reason < 0)
- error ("%s", e.what ());
- }
+ interp_exec (interp_to_use, argv[i]);
}
/* This inserts a number of hooks that are meant to produce
void init (bool top_level) override;
void resume () override;
void suspend () override;
- gdb_exception exec (const char *command_str) override;
+ void exec (const char *command_str) override;
ui_out *interp_ui_out () override;
void set_logging (ui_file_up logfile, bool logging_redirect,
bool debug_redirect) override;
{
}
- gdb_exception exec (const char *command) override
+ void exec (const char *command) override
{
/* Just ignore it. */
- return {};
}
void set_logging (ui_file_up logfile, bool logging_redirect,
void init (bool top_level) override;
void resume () override;
void suspend () override;
- gdb_exception exec (const char *command_str) override;
+ void exec (const char *command_str) override;
ui_out *interp_ui_out () override;
};
return tui_old_uiout;
}
-gdb_exception
+void
tui_interp::exec (const char *command_str)
{
internal_error (_("tui_exec called"));