diff options
author | Tom Tromey <tromey@redhat.com> | 2008-12-12 17:58:48 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2008-12-12 17:58:48 +0000 |
commit | fad6eecd5d0bbccca6db96c20589a0bda9aeca48 (patch) | |
tree | 8a22ba513f3c928fdf257b859477d5514d3d6ae4 /gdb/cli | |
parent | 17c8aaf5078f15d4cd621a5428a82080a7f4c516 (diff) | |
download | gdb-fad6eecd5d0bbccca6db96c20589a0bda9aeca48.zip gdb-fad6eecd5d0bbccca6db96c20589a0bda9aeca48.tar.gz gdb-fad6eecd5d0bbccca6db96c20589a0bda9aeca48.tar.bz2 |
gdb
PR cli/2563:
* cli/cli-decode.c (delete_cmd): Add hook-related out parameters.
(add_cmd): Update. Install hooks into new command.
(add_alias_cmd): Update.
gdb/testsuite
* gdb.base/commands.exp (redefine_hook_test): New proc.
Call it.
Diffstat (limited to 'gdb/cli')
-rw-r--r-- | gdb/cli/cli-decode.c | 48 |
1 files changed, 38 insertions, 10 deletions
diff --git a/gdb/cli/cli-decode.c b/gdb/cli/cli-decode.c index 613b8d7..f1ef680 100644 --- a/gdb/cli/cli-decode.c +++ b/gdb/cli/cli-decode.c @@ -38,7 +38,11 @@ static void undef_cmd_error (char *, char *); static struct cmd_list_element *delete_cmd (char *name, - struct cmd_list_element **list); + struct cmd_list_element **list, + struct cmd_list_element **prehook, + struct cmd_list_element **prehookee, + struct cmd_list_element **posthook, + struct cmd_list_element **posthookee); static struct cmd_list_element *find_cmd (char *command, int len, @@ -161,9 +165,18 @@ add_cmd (char *name, enum command_class class, void (*fun) (char *, int), /* Turn each alias of the old command into an alias of the new command. */ - c->aliases = delete_cmd (name, list); + c->aliases = delete_cmd (name, list, &c->hook_pre, &c->hookee_pre, + &c->hook_post, &c->hookee_post); for (iter = c->aliases; iter; iter = iter->alias_chain) iter->cmd_pointer = c; + if (c->hook_pre) + c->hook_pre->hookee_pre = c; + if (c->hookee_pre) + c->hookee_pre->hook_pre = c; + if (c->hook_post) + c->hook_post->hookee_post = c; + if (c->hookee_post) + c->hookee_post->hook_post = c; if (*list == NULL || strcmp ((*list)->name, name) >= 0) { @@ -189,8 +202,6 @@ add_cmd (char *name, enum command_class class, void (*fun) (char *, int), c->flags = 0; c->replacement = NULL; c->pre_show_hook = NULL; - c->hook_pre = NULL; - c->hook_post = NULL; c->hook_in = 0; c->prefixlist = NULL; c->prefixname = NULL; @@ -202,8 +213,6 @@ add_cmd (char *name, enum command_class class, void (*fun) (char *, int), c->var_type = var_boolean; c->enums = NULL; c->user_commands = NULL; - c->hookee_pre = NULL; - c->hookee_post = NULL; c->cmd_pointer = NULL; c->alias_chain = NULL; @@ -247,9 +256,13 @@ add_alias_cmd (char *name, char *oldname, enum command_class class, if (old == 0) { - struct cmd_list_element *aliases = delete_cmd (name, list); + struct cmd_list_element *prehook, *prehookee, *posthook, *posthookee; + struct cmd_list_element *aliases = delete_cmd (name, list, + &prehook, &prehookee, + &posthook, &posthookee); /* If this happens, it means a programmer error somewhere. */ - gdb_assert (!aliases); + gdb_assert (!aliases && !prehook && prehookee + && !posthook && ! posthookee); return 0; } @@ -628,15 +641,26 @@ add_setshow_zinteger_cmd (char *name, enum command_class class, /* Remove the command named NAME from the command list. Return the list commands which were aliased to the deleted command. If the - command had no aliases, return NULL. */ + command had no aliases, return NULL. The various *HOOKs are set to + the pre- and post-hook commands for the deleted command. If the + command does not have a hook, the corresponding out parameter is + set to NULL. */ static struct cmd_list_element * -delete_cmd (char *name, struct cmd_list_element **list) +delete_cmd (char *name, struct cmd_list_element **list, + struct cmd_list_element **prehook, + struct cmd_list_element **prehookee, + struct cmd_list_element **posthook, + struct cmd_list_element **posthookee) { struct cmd_list_element *iter; struct cmd_list_element **previous_chain_ptr; struct cmd_list_element *aliases = NULL; + *prehook = NULL; + *prehookee = NULL; + *posthook = NULL; + *posthookee = NULL; previous_chain_ptr = list; for (iter = *previous_chain_ptr; iter; iter = *previous_chain_ptr) @@ -645,8 +669,12 @@ delete_cmd (char *name, struct cmd_list_element **list) { if (iter->hookee_pre) iter->hookee_pre->hook_pre = 0; + *prehook = iter->hook_pre; + *prehookee = iter->hookee_pre; if (iter->hookee_post) iter->hookee_post->hook_post = 0; + *posthook = iter->hook_post; + *posthookee = iter->hookee_post; /* Update the link. */ *previous_chain_ptr = iter->next; |