aboutsummaryrefslogtreecommitdiff
path: root/gdb/cli
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2017-09-09 20:51:33 -0600
committerTom Tromey <tom@tromey.com>2017-09-27 08:44:14 -0600
commit0450cc4ce8b4775c47e9aaa1c5a34e181b10ae98 (patch)
treef72a3f6796ac10fe11c3ca341aaf22aea3a8b693 /gdb/cli
parenta9bbfbd85fddfea2db30810c33c4bb130a2ef773 (diff)
downloadgdb-0450cc4ce8b4775c47e9aaa1c5a34e181b10ae98.zip
gdb-0450cc4ce8b4775c47e9aaa1c5a34e181b10ae98.tar.gz
gdb-0450cc4ce8b4775c47e9aaa1c5a34e181b10ae98.tar.bz2
Add add_cmd function overloads
This adds two add_cmd overloads: one whose callback takes a const char *, and one that doesn't accept a function at all. The no-function overload was introduced to avoid ambiguity when NULL was passed as the function. Long term the goal is for all commands to take const arguments, and for the non-const variants to be removed entirely. gdb/ChangeLog 2017-09-27 Tom Tromey <tom@tromey.com> * cli/cli-decode.c (add_cmd, set_cmd_cfunc): New function overloads. (do_add_cmd): Rename from add_cmd. Don't call set_cmd_cfunc. (do_const_cfunc): New function. (cmd_cfunc_eq): New overload. (cli_user_command_p): Check do_const_cfunc. * cli/cli-decode.h (struct cmd_list_element) <function>: New field const_cfunc. * command.h (add_cmd): Add const overload and no-function overload. (set_cmd_cfunc): Add const overload. (cmd_const_cfunc_ftype): Declare. (cmd_cfunc_eq): Add const overload. * breakpoint.c, cli-cmds.c, cli-dump.c, guile/scm-cmd.c, python/py-cmd.c, target.c, tracepoint.c: Use no-function add_cmd overload.
Diffstat (limited to 'gdb/cli')
-rw-r--r--gdb/cli/cli-cmds.c22
-rw-r--r--gdb/cli/cli-decode.c73
-rw-r--r--gdb/cli/cli-decode.h2
-rw-r--r--gdb/cli/cli-dump.c4
4 files changed, 77 insertions, 24 deletions
diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c
index cbafb13..67910be 100644
--- a/gdb/cli/cli-cmds.c
+++ b/gdb/cli/cli-cmds.c
@@ -1693,28 +1693,28 @@ _initialize_cli_cmds (void)
/* Define the classes of commands.
They will appear in the help list in alphabetical order. */
- add_cmd ("internals", class_maintenance, NULL, _("\
+ add_cmd ("internals", class_maintenance, _("\
Maintenance commands.\n\
Some gdb commands are provided just for use by gdb maintainers.\n\
These commands are subject to frequent change, and may not be as\n\
well documented as user commands."),
&cmdlist);
- add_cmd ("obscure", class_obscure, NULL, _("Obscure features."), &cmdlist);
- add_cmd ("aliases", class_alias, NULL,
+ add_cmd ("obscure", class_obscure, _("Obscure features."), &cmdlist);
+ add_cmd ("aliases", class_alias,
_("Aliases of other commands."), &cmdlist);
- add_cmd ("user-defined", class_user, NULL, _("\
+ add_cmd ("user-defined", class_user, _("\
User-defined commands.\n\
The commands in this class are those defined by the user.\n\
Use the \"define\" command to define a command."), &cmdlist);
- add_cmd ("support", class_support, NULL, _("Support facilities."), &cmdlist);
+ add_cmd ("support", class_support, _("Support facilities."), &cmdlist);
if (!dbx_commands)
- add_cmd ("status", class_info, NULL, _("Status inquiries."), &cmdlist);
- add_cmd ("files", class_files, NULL, _("Specifying and examining files."),
+ add_cmd ("status", class_info, _("Status inquiries."), &cmdlist);
+ add_cmd ("files", class_files, _("Specifying and examining files."),
&cmdlist);
- add_cmd ("breakpoints", class_breakpoint, NULL,
+ add_cmd ("breakpoints", class_breakpoint,
_("Making program stop at certain points."), &cmdlist);
- add_cmd ("data", class_vars, NULL, _("Examining data."), &cmdlist);
- add_cmd ("stack", class_stack, NULL, _("\
+ add_cmd ("data", class_vars, _("Examining data."), &cmdlist);
+ add_cmd ("stack", class_stack, _("\
Examining the stack.\n\
The stack is made up of stack frames. Gdb assigns numbers to stack frames\n\
counting from zero for the innermost (currently executing) frame.\n\n\
@@ -1723,7 +1723,7 @@ Variable lookups are done with respect to the selected frame.\n\
When the program being debugged stops, gdb selects the innermost frame.\n\
The commands below can be used to select other frames by number or address."),
&cmdlist);
- add_cmd ("running", class_run, NULL, _("Running the program."), &cmdlist);
+ add_cmd ("running", class_run, _("Running the program."), &cmdlist);
/* Define general commands. */
diff --git a/gdb/cli/cli-decode.c b/gdb/cli/cli-decode.c
index 1bbbe46..257a9c4 100644
--- a/gdb/cli/cli-decode.c
+++ b/gdb/cli/cli-decode.c
@@ -103,7 +103,7 @@ print_help_for_command (struct cmd_list_element *c, const char *prefix,
static void
do_cfunc (struct cmd_list_element *c, char *args, int from_tty)
{
- c->function.cfunc (args, from_tty); /* Ok. */
+ c->function.cfunc (args, from_tty);
}
void
@@ -113,13 +113,29 @@ set_cmd_cfunc (struct cmd_list_element *cmd, cmd_cfunc_ftype *cfunc)
cmd->func = NULL;
else
cmd->func = do_cfunc;
- cmd->function.cfunc = cfunc; /* Ok. */
+ cmd->function.cfunc = cfunc;
+}
+
+static void
+do_const_cfunc (struct cmd_list_element *c, char *args, int from_tty)
+{
+ c->function.const_cfunc (args, from_tty);
+}
+
+void
+set_cmd_cfunc (struct cmd_list_element *cmd, cmd_const_cfunc_ftype *cfunc)
+{
+ if (cfunc == NULL)
+ cmd->func = NULL;
+ else
+ cmd->func = do_const_cfunc;
+ cmd->function.const_cfunc = cfunc;
}
static void
do_sfunc (struct cmd_list_element *c, char *args, int from_tty)
{
- c->function.sfunc (args, from_tty, c); /* Ok. */
+ c->function.sfunc (args, from_tty, c);
}
void
@@ -129,7 +145,7 @@ set_cmd_sfunc (struct cmd_list_element *cmd, cmd_sfunc_ftype *sfunc)
cmd->func = NULL;
else
cmd->func = do_sfunc;
- cmd->function.sfunc = sfunc; /* Ok. */
+ cmd->function.sfunc = sfunc;
}
int
@@ -138,6 +154,12 @@ cmd_cfunc_eq (struct cmd_list_element *cmd, cmd_cfunc_ftype *cfunc)
return cmd->func == do_cfunc && cmd->function.cfunc == cfunc;
}
+int
+cmd_cfunc_eq (struct cmd_list_element *cmd, cmd_const_cfunc_ftype *cfunc)
+{
+ return cmd->func == do_const_cfunc && cmd->function.const_cfunc == cfunc;
+}
+
void
set_cmd_context (struct cmd_list_element *cmd, void *context)
{
@@ -189,9 +211,9 @@ set_cmd_completer_handle_brkchars (struct cmd_list_element *cmd,
Returns a pointer to the added command (not necessarily the head
of *LIST). */
-struct cmd_list_element *
-add_cmd (const char *name, enum command_class theclass, cmd_cfunc_ftype *fun,
- const char *doc, struct cmd_list_element **list)
+static struct cmd_list_element *
+do_add_cmd (const char *name, enum command_class theclass,
+ const char *doc, struct cmd_list_element **list)
{
struct cmd_list_element *c = XNEW (struct cmd_list_element);
struct cmd_list_element *p, *iter;
@@ -229,7 +251,6 @@ add_cmd (const char *name, enum command_class theclass, cmd_cfunc_ftype *fun,
c->name = name;
c->theclass = theclass;
- set_cmd_cfunc (c, fun);
set_cmd_context (c, NULL);
c->doc = doc;
c->cmd_deprecated = 0;
@@ -259,6 +280,35 @@ add_cmd (const char *name, enum command_class theclass, cmd_cfunc_ftype *fun,
return c;
}
+struct cmd_list_element *
+add_cmd (const char *name, enum command_class theclass, cmd_cfunc_ftype *fun,
+ const char *doc, struct cmd_list_element **list)
+{
+ cmd_list_element *result = do_add_cmd (name, theclass, doc, list);
+ set_cmd_cfunc (result, fun);
+ return result;
+}
+
+struct cmd_list_element *
+add_cmd (const char *name, enum command_class theclass,
+ const char *doc, struct cmd_list_element **list)
+{
+ cmd_list_element *result = do_add_cmd (name, theclass, doc, list);
+ result->func = NULL;
+ result->function.cfunc = NULL; /* Ok. */
+ return result;
+}
+
+struct cmd_list_element *
+add_cmd (const char *name, enum command_class theclass,
+ cmd_const_cfunc_ftype *fun,
+ const char *doc, struct cmd_list_element **list)
+{
+ cmd_list_element *result = do_add_cmd (name, theclass, doc, list);
+ set_cmd_cfunc (result, fun);
+ return result;
+}
+
/* Deprecates a command CMD.
REPLACEMENT is the name of the command which should be used in
place of this command, or NULL if no such command exists.
@@ -301,7 +351,7 @@ add_alias_cmd (const char *name, cmd_list_element *old,
return 0;
}
- struct cmd_list_element *c = add_cmd (name, theclass, NULL, old->doc, list);
+ struct cmd_list_element *c = add_cmd (name, theclass, old->doc, list);
/* If OLD->DOC can be freed, we should make another copy. */
if (old->doc_allocated)
@@ -419,7 +469,7 @@ add_set_or_show_cmd (const char *name,
const char *doc,
struct cmd_list_element **list)
{
- struct cmd_list_element *c = add_cmd (name, theclass, NULL, doc, list);
+ struct cmd_list_element *c = add_cmd (name, theclass, doc, list);
gdb_assert (type == set_cmd || type == show_cmd);
c->type = type;
@@ -1909,5 +1959,6 @@ int
cli_user_command_p (struct cmd_list_element *cmd)
{
return (cmd->theclass == class_user
- && (cmd->func == do_cfunc || cmd->func == do_sfunc));
+ && (cmd->func == do_cfunc || cmd->func == do_sfunc
+ || cmd->func == do_const_cfunc));
}
diff --git a/gdb/cli/cli-decode.h b/gdb/cli/cli-decode.h
index 50b858c..691bfe3 100644
--- a/gdb/cli/cli-decode.h
+++ b/gdb/cli/cli-decode.h
@@ -114,6 +114,8 @@ struct cmd_list_element
{
/* If type is not_set_cmd, call it like this: */
cmd_cfunc_ftype *cfunc;
+ /* ... or like this. */
+ cmd_const_cfunc_ftype *const_cfunc;
/* If type is set_cmd or show_cmd, first set the variables,
and then call this: */
cmd_sfunc_ftype *sfunc;
diff --git a/gdb/cli/cli-dump.c b/gdb/cli/cli-dump.c
index 8d57119..550548a 100644
--- a/gdb/cli/cli-dump.c
+++ b/gdb/cli/cli-dump.c
@@ -360,7 +360,7 @@ add_dump_command (const char *name,
struct cmd_list_element *c;
struct dump_context *d;
- c = add_cmd (name, all_commands, NULL, descr, &dump_cmdlist);
+ c = add_cmd (name, all_commands, descr, &dump_cmdlist);
c->completer = filename_completer;
d = XNEW (struct dump_context);
d->func = func;
@@ -368,7 +368,7 @@ add_dump_command (const char *name,
set_cmd_context (c, d);
c->func = call_dump_func;
- c = add_cmd (name, all_commands, NULL, descr, &append_cmdlist);
+ c = add_cmd (name, all_commands, descr, &append_cmdlist);
c->completer = filename_completer;
d = XNEW (struct dump_context);
d->func = func;