This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch] execute_cmd_{pre,post}_hook()


Hello,

This cleans up more code that looks at the internals of the command 
structure.

Committed.

Andrew
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.

Index: command.h
===================================================================
RCS file: /cvs/src/src/gdb/command.h,v
retrieving revision 1.25
diff -u -r1.25 command.h
--- command.h	2002/03/06 06:28:33	1.25
+++ command.h	2002/03/17 19:37:22
@@ -300,6 +300,12 @@
 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);
Index: infrun.c
===================================================================
RCS file: /cvs/src/src/gdb/infrun.c,v
retrieving revision 1.54
diff -u -r1.54 infrun.c
--- infrun.c	2002/02/24 22:31:19	1.54
+++ infrun.c	2002/03/17 19:37:31
@@ -3414,14 +3414,12 @@
 
   target_terminal_ours ();
 
-  /* Look up the hook_stop and run it if it exists.  */
+  /* 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 (stop_command && stop_command->hook_pre)
-    {
-      catch_errors (hook_stop_stub, stop_command->hook_pre,
-		    "Error while running hook_stop:\n", RETURN_MASK_ALL);
-    }
-
   if (!target_has_stack)
     {
 
@@ -3521,7 +3519,7 @@
 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);
 }
 
Index: top.c
===================================================================
RCS file: /cvs/src/src/gdb/top.c,v
retrieving revision 1.58
diff -u -r1.58 top.c
--- top.c	2002/03/06 06:28:34	1.58
+++ top.c	2002/03/17 19:37:46
@@ -693,12 +693,7 @@
 	}
 
       /* 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 @@
 	(*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);
 
     }
 
Index: cli/cli-script.c
===================================================================
RCS file: /cvs/src/src/gdb/cli/cli-script.c,v
retrieving revision 1.10
diff -u -r1.10 cli-script.c
--- cli-script.c	2002/01/17 22:15:18	1.10
+++ cli-script.c	2002/03/17 19:37:51
@@ -213,6 +213,39 @@
     }				/* 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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]