aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog14
-rw-r--r--gdb/cli/cli-script.c33
-rw-r--r--gdb/command.h6
-rw-r--r--gdb/infrun.c14
-rw-r--r--gdb/top.c14
5 files changed, 61 insertions, 20 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 5332ca3..d6dc6dc 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,19 @@
2002-03-17 Andrew Cagney <ac131313@redhat.com>
+ * command.h: (execute_cmd_post_hook): Declare.
+ (execute_cmd_pre_hook): Declare.
+ * cli/cli-script.c (clear_hook_in_cleanup): New function.
+ (execute_cmd_post_hook, execute_cmd_pre_hook): New
+ functions. Execute pre/post hook while ensuring that afterwords
+ hook_in is cleared.
+ * top.c (execute_command): Use execute_cmd_post_hook, and
+ execute_cmd_pre_hook to execute pre/post commands.
+ * infrun.c (normal_stop): Pass stop_command and not pre_hook to
+ hook_stop_stub.
+ (hook_stop_stub): Call execute_cmd_pre_hook.
+
+2002-03-17 Andrew Cagney <ac131313@redhat.com>
+
* kod.c (kod_set_os): Revert previous change. Is called by ``info
set'' and this leads to a core dump. Move xstrdup of
operating_system to after check that it is not NULL.
diff --git a/gdb/cli/cli-script.c b/gdb/cli/cli-script.c
index 4545117..b438fef 100644
--- a/gdb/cli/cli-script.c
+++ b/gdb/cli/cli-script.c
@@ -213,6 +213,39 @@ print_command_lines (struct ui_out *uiout, struct command_line *cmd,
} /* while (list) */
}
+/* Handle pre-post hooks. */
+
+void
+clear_hook_in_cleanup (void *data)
+{
+ struct cmd_list_element *c = data;
+ c->hook_in = 0; /* Allow hook to work again once it is complete */
+}
+
+void
+execute_cmd_pre_hook (struct cmd_list_element *c)
+{
+ if ((c->hook_pre) && (!c->hook_in))
+ {
+ struct cleanup *cleanups = make_cleanup (clear_hook_in_cleanup, c);
+ c->hook_in = 1; /* Prevent recursive hooking */
+ execute_user_command (c->hook_pre, (char *) 0);
+ do_cleanups (cleanups);
+ }
+}
+
+void
+execute_cmd_post_hook (struct cmd_list_element *c)
+{
+ if ((c->hook_post) && (!c->hook_in))
+ {
+ struct cleanup *cleanups = make_cleanup (clear_hook_in_cleanup, c);
+ c->hook_in = 1; /* Prevent recursive hooking */
+ execute_user_command (c->hook_post, (char *) 0);
+ do_cleanups (cleanups);
+ }
+}
+
/* Execute the command in CMD. */
void
diff --git a/gdb/command.h b/gdb/command.h
index bebf6eb..58574f4 100644
--- a/gdb/command.h
+++ b/gdb/command.h
@@ -300,6 +300,12 @@ extern void set_cmd_completer (struct cmd_list_element *cmd,
extern int cmd_cfunc_eq (struct cmd_list_element *cmd,
void (*cfunc) (char *args, int from_tty));
+/* Execute CMD's pre/post hook. Throw an error if the command fails.
+ If already executing this pre/post hook, or there is no pre/post
+ hook, the call is silently ignored. */
+extern void execute_cmd_pre_hook (struct cmd_list_element *cmd);
+extern void execute_cmd_post_hook (struct cmd_list_element *cmd);
+
extern struct cmd_list_element *lookup_cmd (char **,
struct cmd_list_element *, char *,
int, int);
diff --git a/gdb/infrun.c b/gdb/infrun.c
index 6ae8f7c..466305f 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -3414,13 +3414,11 @@ and/or watchpoints.\n");
target_terminal_ours ();
- /* Look up the hook_stop and run it if it exists. */
-
- if (stop_command && stop_command->hook_pre)
- {
- catch_errors (hook_stop_stub, stop_command->hook_pre,
- "Error while running hook_stop:\n", RETURN_MASK_ALL);
- }
+ /* Look up the hook_stop and run it (CLI internally handles problem
+ of stop_command's pre-hook not existing). */
+ if (stop_command)
+ catch_errors (hook_stop_stub, stop_command,
+ "Error while running hook_stop:\n", RETURN_MASK_ALL);
if (!target_has_stack)
{
@@ -3521,7 +3519,7 @@ done:
static int
hook_stop_stub (void *cmd)
{
- execute_user_command ((struct cmd_list_element *) cmd, 0);
+ execute_cmd_pre_hook ((struct cmd_list_element *) cmd);
return (0);
}
diff --git a/gdb/top.c b/gdb/top.c
index 16d590f..83c8441 100644
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -693,12 +693,7 @@ execute_command (char *p, int from_tty)
}
/* If this command has been pre-hooked, run the hook first. */
- if ((c->hook_pre) && (!c->hook_in))
- {
- c->hook_in = 1; /* Prevent recursive hooking */
- execute_user_command (c->hook_pre, (char *) 0);
- c->hook_in = 0; /* Allow hook to work again once it is complete */
- }
+ execute_cmd_pre_hook (c);
if (c->flags & DEPRECATED_WARN_USER)
deprecated_cmd_warning (&line);
@@ -715,12 +710,7 @@ execute_command (char *p, int from_tty)
(*c->func) (c, arg, from_tty & caution);
/* If this command has been post-hooked, run the hook last. */
- if ((c->hook_post) && (!c->hook_in))
- {
- c->hook_in = 1; /* Prevent recursive hooking */
- execute_user_command (c->hook_post, (char *) 0);
- c->hook_in = 0; /* allow hook to work again once it is complete */
- }
+ execute_cmd_post_hook (c);
}