diff options
author | Pedro Alves <palves@redhat.com> | 2017-02-03 16:30:04 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2017-02-03 16:30:04 +0000 |
commit | d6f9b0fbc7998909712cbc1b194f1cbd4ae8b6fa (patch) | |
tree | 2c0ddedef2b9335ea7364479480a69799393afbe /gdb/interps.c | |
parent | e666304ec603bb3249f80bac97200f2b4520ab0f (diff) | |
download | binutils-gdb-d6f9b0fbc7998909712cbc1b194f1cbd4ae8b6fa.tar.gz |
C++-fy struct interp/cli_interp/tui_interp/mi_interp
- The interp->data field disappears, since we can put data in the
interpreter directly now. The "init" method remains in place, but
it now returns void.
- A few places check if the interpreter method is NULL before calling
it, and also check whether the method returns true/false. For some
of those methods, all current implementations always return true.
In those cases, this commit makes the C++-fied method return void
instead and cleans up the callers.
Tested on x86_64 Fedora 23.
gdb/ChangeLog:
2017-02-03 Pedro Alves <palves@redhat.com>
* cli/cli-interp.c (cli_interp_base::cli_interp_base)
(cli_interp_base::~cli_interp_base): New.
(cli_interp): New struct.
(as_cli_interp): Cast the interp itself to cli_interp.
(cli_interpreter_pre_command_loop): Rename to ...
(cli_interp_base::pre_command_loop): ... this. Remove 'self'
parameter.
(cli_interpreter_init): Rename to ...
(cli_interp::init): ... this. Remove 'self' parameter. Use
boolean. Make extern.
(cli_interpreter_resume): Rename to ...
(cli_interp::resume): ... this. Remove 'data' parameter. Make
extern.
(cli_interpreter_suspend): Rename to ...
(cli_interp::suspend): ... this. Remove 'data' parameter. Make
extern.
(cli_interpreter_exec): Rename to ...
(cli_interp::exec): ... this. Remove 'data' parameter. Make
extern.
(cli_interpreter_supports_command_editing): Rename to ...
(cli_interp_base::supports_command_editing): ... this. Remove
'interp' parameter. Make extern.
(cli_ui_out): Rename to ...
(cli_interp::interp_ui_out): ... this. Remove 'interp' parameter.
Make extern.
(cli_set_logging): Rename to ...
(cli_interp_base::set_logging): ... this. Remove 'interp'
parameter. Make extern.
(cli_interp_procs): Delete.
(cli_interp_factory): Adjust to use "new".
* cli/cli-interp.h: Include "interps.h".
(struct cli_interp_base): New struct.
* interps.c (struct interp): Delete. Fields moved to interps.h.
(interp_new): Delete.
(interp::interp, interp::~interp): New.
(interp_set): Use bool, and return void. Assume the interpreter
has suspend, init and resume methods, and that the all return
void.
(set_top_level_interpreter): interp_set returns void.
(interp_ui_out): Adapt.
(current_interp_set_logging): Adapt.
(interp_data): Delete.
(interp_pre_command_loop, interp_supports_command_editing): Adapt.
(interp_exec): Adapt.
(top_level_interpreter_data): Delete.
* interps.h (interp_init_ftype, interp_resume_ftype)
(interp_suspend_ftype, interp_exec_ftype)
(interp_pre_command_loop_ftype, interp_ui_out_ftype): Delete.
(class interp): New.
(interp_new): Delete.
(interp_set): Now returns void. Use bool.
(interp_data, top_level_interpreter_data): Delete.
* mi/mi-common.h: Include interps.h.
(class mi_interp): Inherit from interp. Define a ctor. Declare
init, resume, suspect, exec, interp_ui_out, set_logging and
pre_command_loop methods.
* mi/mi-interp.c (as_mi_interp): Cast the interp itself.
(mi_interpreter_init): Rename to ...
(mi_interp::init): ... this. Remove the 'interp' parameter, use
bool, return void and make extern. Adjust.
(mi_interpreter_resume): ... Rename to ...
(mi_interp::resume): ... this. Remove the 'data' parameter,
return void and make extern. Adjust.
(mi_interpreter_suspend): ... Rename to ...
(mi_interp::suspend): ... this. Remove the 'data' parameter,
return void and make extern. Adjust.
(mi_interpreter_exec): ... Rename to ...
(mi_interp::exec): ... this. Remove the 'data' parameter and make
extern. Adjust.
(mi_interpreter_pre_command_loop): ... Rename to ...
(mi_interp::pre_command_loop): ... this. Remove the 'self'
parameter and make extern.
(mi_on_normal_stop_1): Adjust.
(mi_ui_out): Rename to ...
(mi_interp::interp_ui_out): ... this. Remove the 'interp'
parameter and make extern. Adjust.
(mi_set_logging): Rename to ...
(mi_interp::set_logging): ... this. Remove the 'interp'
parameter and make extern. Adjust.
(mi_interp_procs): Delete.
(mi_interp_factory): Adjust to use 'new'.
* mi/mi-main.c (mi_cmd_gdb_exit, captured_mi_execute_command)
(mi_print_exception, mi_execute_command, mi_load_progress):
Adjust.
* tui/tui-interp.c (tui_interp): New class.
(as_tui_interp): Return a tui_interp pointer.
(tui_on_normal_stop, tui_on_signal_received)
(tui_on_end_stepping_range, tui_on_signal_exited, tui_on_exited)
(tui_on_no_history, tui_on_user_selected_context_changed): Adjust
to use interp::interp_ui_out.
(tui_init): Rename to ...
(tui_interp::init): ... this. Remove the 'self' parameter, use
bool, return void and make extern. Adjust.
(tui_resume): Rename to ...
(tui_interp::resume): ... this. Remove the 'data' parameter,
return void and make extern. Adjust.
(tui_suspend): Rename to ...
(tui_interp::suspend): ... this. Remove the 'data' parameter,
return void and make extern. Adjust.
(tui_ui_out): Rename to ...
(tui_interp::interp_ui_out): ... this. Remove the 'self'
parameter, and make extern. Adjust.
(tui_exec): Rename to ...
(tui_interp::exec): ... this. Remove the 'data' parameter and
make extern.
(tui_interp_procs): Delete.
(tui_interp_factory): Use "new".
Diffstat (limited to 'gdb/interps.c')
-rw-r--r-- | gdb/interps.c | 127 |
1 files changed, 24 insertions, 103 deletions
diff --git a/gdb/interps.c b/gdb/interps.c index 06e7ccfc8ab..d31d53b9175 100644 --- a/gdb/interps.c +++ b/gdb/interps.c @@ -72,28 +72,6 @@ get_current_interp_info (void) return get_interp_info (current_ui); } -struct interp -{ - /* This is the name in "-i=" and set interpreter. */ - const char *name; - - /* Interpreters are stored in a linked list, this is the next - one... */ - struct interp *next; - - /* This is a cookie that an instance of the interpreter can use. - This is a bit confused right now as the exact initialization - sequence for it, and how it relates to the interpreter's uiout - object is a bit confused. */ - void *data; - - /* Has the init_proc been run? */ - int inited; - - const struct interp_procs *procs; - int quiet_p; -}; - /* The magic initialization routine for this module. */ void _initialize_interpreter (void); @@ -101,25 +79,16 @@ void _initialize_interpreter (void); static struct interp *interp_lookup_existing (struct ui *ui, const char *name); -/* interp_new - This allocates space for a new interpreter, - fills the fields from the inputs, and returns a pointer to the - interpreter. */ -struct interp * -interp_new (const char *name, const struct interp_procs *procs, void *data) +interp::interp (const char *name) { - struct interp *new_interp; - - new_interp = XNEW (struct interp); - - new_interp->name = xstrdup (name); - new_interp->data = data; - new_interp->quiet_p = 0; - new_interp->procs = procs; - new_interp->inited = 0; - - return new_interp; + this->name = xstrdup (name); + this->quiet_p = false; + this->inited = false; } +interp::~interp () +{} + /* An interpreter factory. Maps an interpreter name to the factory function that instantiates an interpreter by that name. */ @@ -177,11 +146,7 @@ interp_add (struct ui *ui, struct interp *interp) } /* This sets the current interpreter to be INTERP. If INTERP has not - been initialized, then this will also run the init proc. If the - init proc is successful, return 1, if it fails, set the old - interpreter back in place and return 0. If we can't restore the - old interpreter, then raise an internal error, since we are in - pretty bad shape at this point. + been initialized, then this will also run the init method. The TOP_LEVEL parameter tells if this new interpreter is the top-level one. The top-level is what is requested @@ -190,8 +155,9 @@ interp_add (struct ui *ui, struct interp *interp) MI is the top-level interpreter, then it will always report events such as target stops and new thread creation, even if they are caused by CLI commands. */ -int -interp_set (struct interp *interp, int top_level) + +void +interp_set (struct interp *interp, bool top_level) { struct ui_interp_info *ui_interp = get_current_interp_info (); struct interp *old_interp = ui_interp->current_interpreter; @@ -206,12 +172,7 @@ interp_set (struct interp *interp, int top_level) if (old_interp != NULL) { current_uiout->flush (); - if (old_interp->procs->suspend_proc - && !old_interp->procs->suspend_proc (old_interp->data)) - { - error (_("Could not suspend interpreter \"%s\"."), - old_interp->name); - } + old_interp->suspend (); } else { @@ -232,32 +193,20 @@ interp_set (struct interp *interp, int top_level) interpreter_p = xstrdup (interp->name); } - /* Run the init proc. If it fails, try to restore the old interp. */ - + /* Run the init proc. */ if (!interp->inited) { - if (interp->procs->init_proc != NULL) - { - interp->data = interp->procs->init_proc (interp, top_level); - } - interp->inited = 1; + interp->init (top_level); + interp->inited = true; } /* Do this only after the interpreter is initialized. */ - current_uiout = interp->procs->ui_out_proc (interp); + current_uiout = interp->interp_ui_out (); /* Clear out any installed interpreter hooks/event handlers. */ clear_interpreter_hooks (); - if (interp->procs->resume_proc != NULL - && (!interp->procs->resume_proc (interp->data))) - { - if (old_interp == NULL || !interp_set (old_interp, 0)) - internal_error (__FILE__, __LINE__, - _("Failed to initialize new interp \"%s\" %s"), - interp->name, "and could not restore old interp!\n"); - return 0; - } + interp->resume (); if (!first_time && !interp_quiet_p (interp)) { @@ -265,8 +214,6 @@ interp_set (struct interp *interp, int top_level) "Switching to interpreter \"%.24s\".\n", interp->name); current_uiout->text (buffer); } - - return 1; } /* Look up the interpreter for NAME. If no such interpreter exists, @@ -330,8 +277,7 @@ set_top_level_interpreter (const char *name) if (interp == NULL) error (_("Interpreter `%s' unrecognized"), name); /* Install it. */ - if (!interp_set (interp, 1)) - error (_("Interpreter `%s' failed to initialize."), name); + interp_set (interp, true); } /* Returns the current interpreter. */ @@ -343,7 +289,7 @@ interp_ui_out (struct interp *interp) if (interp == NULL) interp = ui_interp->current_interpreter; - return interp->procs->ui_out_proc (interp); + return interp->interp_ui_out (); } void @@ -353,8 +299,7 @@ current_interp_set_logging (ui_file_up logfile, struct ui_interp_info *ui_interp = get_current_interp_info (); struct interp *interp = ui_interp->current_interpreter; - return interp->procs->set_logging_proc (interp, std::move (logfile), - logging_redirect); + return interp->set_logging (std::move (logfile), logging_redirect); } /* Temporarily overrides the current interpreter. */ @@ -370,14 +315,6 @@ interp_set_temp (const char *name) return old_interp; } -/* Returns the interpreter's cookie. */ - -void * -interp_data (struct interp *interp) -{ - return interp->data; -} - /* Returns the interpreter's name. */ const char * @@ -427,8 +364,7 @@ interp_pre_command_loop (struct interp *interp) { gdb_assert (interp != NULL); - if (interp->procs->pre_command_loop_proc != NULL) - interp->procs->pre_command_loop_proc (interp); + interp->pre_command_loop (); } /* See interp.h */ @@ -436,9 +372,7 @@ interp_pre_command_loop (struct interp *interp) int interp_supports_command_editing (struct interp *interp) { - if (interp->procs->supports_command_editing_proc != NULL) - return interp->procs->supports_command_editing_proc (interp); - return 0; + return interp->supports_command_editing (); } int @@ -472,13 +406,11 @@ interp_exec (struct interp *interp, const char *command_str) struct gdb_exception ex; struct interp *save_command_interp; - gdb_assert (interp->procs->exec_proc != NULL); - /* See `command_interp' for why we do this. */ save_command_interp = ui_interp->command_interpreter; ui_interp->command_interpreter = interp; - ex = interp->procs->exec_proc (interp->data, command_str); + ex = interp->exec (command_str); ui_interp->command_interpreter = save_command_interp; @@ -539,8 +471,7 @@ interpreter_exec_cmd (char *args, int from_tty) old_quiet = interp_set_quiet (old_interp, 1); use_quiet = interp_set_quiet (interp_to_use, 1); - if (!interp_set (interp_to_use, 0)) - error (_("Could not switch to interpreter \"%s\"."), prules[0]); + interp_set (interp_to_use, false); for (i = 1; i < nrules; i++) { @@ -612,16 +543,6 @@ top_level_interpreter (void) return ui_interp->top_level_interpreter; } -void * -top_level_interpreter_data (void) -{ - struct interp *interp; - - interp = top_level_interpreter (); - gdb_assert (interp != NULL); - return interp->data; -} - /* See interps.h. */ struct interp * |