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".
This commit is contained in:
Pedro Alves
2017-02-03 16:30:04 +00:00
parent e666304ec6
commit d6f9b0fbc7
9 changed files with 306 additions and 273 deletions

View File

@@ -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 *