Allocate cmd_list_element with new

This adds a constructor and destructor to cmd_list_element and changes
it to be allocated with new.  This will be useful in a subsequent
patch.

ChangeLog
2018-05-04  Tom Tromey  <tom@tromey.com>

	* cli/cli-decode.h (cmd_list_element): New constructor.
	(~cmd_list_element): New destructor.
	(struct cmd_list_element): Add initializers.
	* cli/cli-decode.c (do_add_cmd): Use "new".
	(delete_cmd): Use "delete".
This commit is contained in:
Tom Tromey 2018-04-16 21:09:48 -06:00
parent a3b60e4588
commit e2fc72e2c5
3 changed files with 62 additions and 55 deletions

View File

@ -1,3 +1,11 @@
2018-05-04 Tom Tromey <tom@tromey.com>
* cli/cli-decode.h (cmd_list_element): New constructor.
(~cmd_list_element): New destructor.
(struct cmd_list_element): Add initializers.
* cli/cli-decode.c (do_add_cmd): Use "new".
(delete_cmd): Use "delete".
2018-05-04 Jan Kratochvil <jan.kratochvil@redhat.com> 2018-05-04 Jan Kratochvil <jan.kratochvil@redhat.com>
Pedro Alves <palves@redhat.com> Pedro Alves <palves@redhat.com>

View File

@ -193,7 +193,8 @@ static struct cmd_list_element *
do_add_cmd (const char *name, enum command_class theclass, do_add_cmd (const char *name, enum command_class theclass,
const char *doc, struct cmd_list_element **list) const char *doc, struct cmd_list_element **list)
{ {
struct cmd_list_element *c = XNEW (struct cmd_list_element); struct cmd_list_element *c = new struct cmd_list_element (name, theclass,
doc);
struct cmd_list_element *p, *iter; struct cmd_list_element *p, *iter;
/* Turn each alias of the old command into an alias of the new /* Turn each alias of the old command into an alias of the new
@ -227,34 +228,6 @@ do_add_cmd (const char *name, enum command_class theclass,
p->next = c; p->next = c;
} }
c->name = name;
c->theclass = theclass;
set_cmd_context (c, NULL);
c->doc = doc;
c->cmd_deprecated = 0;
c->deprecated_warn_user = 0;
c->malloced_replacement = 0;
c->doc_allocated = 0;
c->replacement = NULL;
c->pre_show_hook = NULL;
c->hook_in = 0;
c->prefixlist = NULL;
c->prefixname = NULL;
c->allow_unknown = 0;
c->prefix = NULL;
c->abbrev_flag = 0;
set_cmd_completer (c, symbol_completer);
c->completer_handle_brkchars = NULL;
c->destroyer = NULL;
c->type = not_set_cmd;
c->var = NULL;
c->var_type = var_boolean;
c->enums = NULL;
c->user_commands = NULL;
c->cmd_pointer = NULL;
c->alias_chain = NULL;
c->suppress_notification = NULL;
return c; return c;
} }
@ -841,8 +814,6 @@ delete_cmd (const char *name, struct cmd_list_element **list,
*prehookee = iter->hookee_pre; *prehookee = iter->hookee_pre;
if (iter->hookee_post) if (iter->hookee_post)
iter->hookee_post->hook_post = 0; iter->hookee_post->hook_post = 0;
if (iter->doc && iter->doc_allocated)
xfree ((char *) iter->doc);
*posthook = iter->hook_post; *posthook = iter->hook_post;
*posthookee = iter->hookee_post; *posthookee = iter->hookee_post;
@ -866,7 +837,7 @@ delete_cmd (const char *name, struct cmd_list_element **list,
*prevp = iter->alias_chain; *prevp = iter->alias_chain;
} }
xfree (iter); delete iter;
/* We won't see another command with the same name. */ /* We won't see another command with the same name. */
break; break;

View File

@ -45,8 +45,35 @@ cmd_types;
struct cmd_list_element struct cmd_list_element
{ {
cmd_list_element (const char *name_, enum command_class theclass_,
const char *doc_)
: name (name_),
theclass (theclass_),
cmd_deprecated (0),
deprecated_warn_user (0),
malloced_replacement (0),
doc_allocated (0),
hook_in (0),
allow_unknown (0),
abbrev_flag (0),
type (not_set_cmd),
var_type (var_boolean),
doc (doc_)
{
memset (&function, 0, sizeof (function));
}
~cmd_list_element ()
{
if (doc && doc_allocated)
xfree ((char *) doc);
}
DISABLE_COPY_AND_ASSIGN (cmd_list_element);
/* Points to next command in this list. */ /* Points to next command in this list. */
struct cmd_list_element *next; struct cmd_list_element *next = nullptr;
/* Name of this command. */ /* Name of this command. */
const char *name; const char *name;
@ -107,7 +134,8 @@ struct cmd_list_element
cagney/2002-02-02: This function signature is evolving. For cagney/2002-02-02: This function signature is evolving. For
the moment suggest sticking with either set_cmd_cfunc() or the moment suggest sticking with either set_cmd_cfunc() or
set_cmd_sfunc(). */ set_cmd_sfunc(). */
void (*func) (struct cmd_list_element *c, const char *args, int from_tty); void (*func) (struct cmd_list_element *c, const char *args, int from_tty)
= nullptr;
/* The command's real callback. At present func() bounces through /* The command's real callback. At present func() bounces through
to one of the below. */ to one of the below. */
union union
@ -121,7 +149,7 @@ struct cmd_list_element
function; function;
/* Local state (context) for this command. This can be anything. */ /* Local state (context) for this command. This can be anything. */
void *context; void *context = nullptr;
/* Documentation of this command (or help topic). /* Documentation of this command (or help topic).
First line is brief documentation; remaining lines form, with it, First line is brief documentation; remaining lines form, with it,
@ -131,37 +159,37 @@ struct cmd_list_element
/* For set/show commands. A method for printing the output to the /* For set/show commands. A method for printing the output to the
specified stream. */ specified stream. */
show_value_ftype *show_value_func; show_value_ftype *show_value_func = nullptr;
/* If this command is deprecated, this is the replacement name. */ /* If this command is deprecated, this is the replacement name. */
const char *replacement; const char *replacement = nullptr;
/* If this command represents a show command, then this function /* If this command represents a show command, then this function
is called before the variable's value is examined. */ is called before the variable's value is examined. */
void (*pre_show_hook) (struct cmd_list_element *c); void (*pre_show_hook) (struct cmd_list_element *c) = nullptr;
/* Hook for another command to be executed before this command. */ /* Hook for another command to be executed before this command. */
struct cmd_list_element *hook_pre; struct cmd_list_element *hook_pre = nullptr;
/* Hook for another command to be executed after this command. */ /* Hook for another command to be executed after this command. */
struct cmd_list_element *hook_post; struct cmd_list_element *hook_post = nullptr;
/* Nonzero identifies a prefix command. For them, the address /* Nonzero identifies a prefix command. For them, the address
of the variable containing the list of subcommands. */ of the variable containing the list of subcommands. */
struct cmd_list_element **prefixlist; struct cmd_list_element **prefixlist = nullptr;
/* For prefix commands only: /* For prefix commands only:
String containing prefix commands to get here: this one String containing prefix commands to get here: this one
plus any others needed to get to it. Should end in a space. plus any others needed to get to it. Should end in a space.
It is used before the word "command" in describing the It is used before the word "command" in describing the
commands reached through this prefix. */ commands reached through this prefix. */
const char *prefixname; const char *prefixname = nullptr;
/* The prefix command of this command. */ /* The prefix command of this command. */
struct cmd_list_element *prefix; struct cmd_list_element *prefix = nullptr;
/* Completion routine for this command. */ /* Completion routine for this command. */
completer_ftype *completer; completer_ftype *completer = symbol_completer;
/* Handle the word break characters for this completer. Usually /* Handle the word break characters for this completer. Usually
this function need not be defined, but for some types of this function need not be defined, but for some types of
@ -169,47 +197,47 @@ struct cmd_list_element
a class) the word break chars may need to be redefined a class) the word break chars may need to be redefined
depending on the completer type (e.g., for filename depending on the completer type (e.g., for filename
completers). */ completers). */
completer_handle_brkchars_ftype *completer_handle_brkchars; completer_handle_brkchars_ftype *completer_handle_brkchars = nullptr;
/* Destruction routine for this command. If non-NULL, this is /* Destruction routine for this command. If non-NULL, this is
called when this command instance is destroyed. This may be called when this command instance is destroyed. This may be
used to finalize the CONTEXT field, if needed. */ used to finalize the CONTEXT field, if needed. */
void (*destroyer) (struct cmd_list_element *self, void *context); void (*destroyer) (struct cmd_list_element *self, void *context) = nullptr;
/* Pointer to variable affected by "set" and "show". Doesn't /* Pointer to variable affected by "set" and "show". Doesn't
matter if type is not_set. */ matter if type is not_set. */
void *var; void *var = nullptr;
/* Pointer to NULL terminated list of enumerated values (like /* Pointer to NULL terminated list of enumerated values (like
argv). */ argv). */
const char *const *enums; const char *const *enums = nullptr;
/* Pointer to command strings of user-defined commands */ /* Pointer to command strings of user-defined commands */
struct command_line *user_commands; struct command_line *user_commands = nullptr;
/* Pointer to command that is hooked by this one, (by hook_pre) /* Pointer to command that is hooked by this one, (by hook_pre)
so the hook can be removed when this one is deleted. */ so the hook can be removed when this one is deleted. */
struct cmd_list_element *hookee_pre; struct cmd_list_element *hookee_pre = nullptr;
/* Pointer to command that is hooked by this one, (by hook_post) /* Pointer to command that is hooked by this one, (by hook_post)
so the hook can be removed when this one is deleted. */ so the hook can be removed when this one is deleted. */
struct cmd_list_element *hookee_post; struct cmd_list_element *hookee_post = nullptr;
/* Pointer to command that is aliased by this one, so the /* Pointer to command that is aliased by this one, so the
aliased command can be located in case it has been hooked. */ aliased command can be located in case it has been hooked. */
struct cmd_list_element *cmd_pointer; struct cmd_list_element *cmd_pointer = nullptr;
/* Start of a linked list of all aliases of this command. */ /* Start of a linked list of all aliases of this command. */
struct cmd_list_element *aliases; struct cmd_list_element *aliases = nullptr;
/* Link pointer for aliases on an alias list. */ /* Link pointer for aliases on an alias list. */
struct cmd_list_element *alias_chain; struct cmd_list_element *alias_chain = nullptr;
/* If non-null, the pointer to a field in 'struct /* If non-null, the pointer to a field in 'struct
cli_suppress_notification', which will be set to true in cmd_func cli_suppress_notification', which will be set to true in cmd_func
when this command is being executed. It will be set back to false when this command is being executed. It will be set back to false
when the command has been executed. */ when the command has been executed. */
int *suppress_notification; int *suppress_notification = nullptr;
}; };
extern void help_cmd_list (struct cmd_list_element *, enum command_class, extern void help_cmd_list (struct cmd_list_element *, enum command_class,