diff options
-rw-r--r-- | gdb/cli/cli-interp.c | 49 | ||||
-rw-r--r-- | gdb/interps.c | 21 | ||||
-rw-r--r-- | gdb/interps.h | 5 | ||||
-rw-r--r-- | gdb/mi/mi-interp.c | 10 | ||||
-rw-r--r-- | gdb/mi/mi-interp.h | 2 | ||||
-rw-r--r-- | gdb/python/py-dap.c | 3 | ||||
-rw-r--r-- | gdb/tui/tui-interp.c | 4 |
7 files changed, 30 insertions, 64 deletions
diff --git a/gdb/cli/cli-interp.c b/gdb/cli/cli-interp.c index 5f2ff72..9941014 100644 --- a/gdb/cli/cli-interp.c +++ b/gdb/cli/cli-interp.c @@ -48,7 +48,7 @@ class cli_interp final : public cli_interp_base 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: @@ -75,11 +75,6 @@ as_cli_interp_base (interp *interp) 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 @@ -314,12 +309,9 @@ cli_interp::suspend () 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 @@ -327,41 +319,28 @@ cli_interp::exec (const char *command_str) 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 * diff --git a/gdb/interps.c b/gdb/interps.c index 24dc616..9c7908b 100644 --- a/gdb/interps.c +++ b/gdb/interps.c @@ -39,6 +39,7 @@ #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. */ @@ -332,7 +333,7 @@ interp_supports_command_editing (struct interp *interp) /* 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 (); @@ -341,7 +342,7 @@ interp_exec (struct interp *interp, const char *command_str) 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. @@ -393,19 +394,13 @@ interpreter_exec_cmd (const char *args, int from_tty) 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. */ diff --git a/gdb/interps.h b/gdb/interps.h index 2caa7bf..01bec47 100644 --- a/gdb/interps.h +++ b/gdb/interps.h @@ -36,8 +36,7 @@ typedef struct interp *(*interp_factory_func) (const char *name); 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 { @@ -51,7 +50,7 @@ public: 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 diff --git a/gdb/mi/mi-interp.c b/gdb/mi/mi-interp.c index cf3d738..29d1aee 100644 --- a/gdb/mi/mi-interp.c +++ b/gdb/mi/mi-interp.c @@ -199,11 +199,10 @@ mi_interp::suspend () gdb_disable_readline (); } -gdb_exception +void mi_interp::exec (const char *command) { mi_execute_command_wrapper (command); - return gdb_exception (); } void @@ -240,12 +239,7 @@ mi_cmd_interpreter_exec (const char *command, char **argv, int argc) }; 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 diff --git a/gdb/mi/mi-interp.h b/gdb/mi/mi-interp.h index 827297f..e07be12 100644 --- a/gdb/mi/mi-interp.h +++ b/gdb/mi/mi-interp.h @@ -36,7 +36,7 @@ public: 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; diff --git a/gdb/python/py-dap.c b/gdb/python/py-dap.c index 9c77b2a..32f9272 100644 --- a/gdb/python/py-dap.c +++ b/gdb/python/py-dap.c @@ -45,10 +45,9 @@ public: { } - 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, diff --git a/gdb/tui/tui-interp.c b/gdb/tui/tui-interp.c index 3c28145..812c62c 100644 --- a/gdb/tui/tui-interp.c +++ b/gdb/tui/tui-interp.c @@ -49,7 +49,7 @@ public: 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; }; @@ -149,7 +149,7 @@ tui_interp::interp_ui_out () return tui_old_uiout; } -gdb_exception +void tui_interp::exec (const char *command_str) { internal_error (_("tui_exec called")); |