This is the mail archive of the gdb-patches@sourceware.org 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]

FYI: fix PR python/12216


I plan to check this in.

This fixes PR 12216.  The bug is that invoking a non-repeatable command
via gdb.execute will cause the current command to act as if dont_repeat
was called directly.

This is undesirable; a command should control its own repeatability.

Since global state is already involved, I took the straightforward
approach of more global state.

Built and regtested on x86-64 (compile farm).

Tom

2011-01-25  Tom Tromey  <tromey@redhat.com>

	PR python/12216:
	* python/python.c (execute_gdb_command): Call
	prevent_dont_repeat.
	* top.c (suppress_dont_repeat): New global.
	(dont_repeat): Use it.
	(prevent_dont_repeat): New function.
	* command.h (prevent_dont_repeat): Declare.

diff --git a/gdb/command.h b/gdb/command.h
index f53cc80..d2f5ca5 100644
--- a/gdb/command.h
+++ b/gdb/command.h
@@ -355,6 +355,8 @@ extern void error_no_arg (char *) ATTRIBUTE_NORETURN;
 
 extern void dont_repeat (void);
 
+extern struct cleanup *prevent_dont_repeat (void);
+
 /* Used to mark commands that don't do anything.  If we just leave the
    function field NULL, the command is interpreted as a help topic, or
    as a class of commands.  */
diff --git a/gdb/python/python.c b/gdb/python/python.c
index 134e730..b2ee8f9 100644
--- a/gdb/python/python.c
+++ b/gdb/python/python.c
@@ -375,6 +375,7 @@ execute_gdb_command (PyObject *self, PyObject *args, PyObject *kw)
       char *copy = xstrdup (arg);
       struct cleanup *cleanup = make_cleanup (xfree, copy);
 
+      prevent_dont_repeat ();
       if (to_string)
 	result = execute_command_to_string (copy, from_tty);
       else
diff --git a/gdb/top.c b/gdb/top.c
index bba1a2d..9ca855d 100644
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -546,12 +546,17 @@ command_loop (void)
     }
 }
 
+/* When nonzero, cause dont_repeat to do nothing.  This should only be
+   set via prevent_dont_repeat.  */
+
+static int suppress_dont_repeat = 0;
+
 /* Commands call this if they do not want to be repeated by null lines.  */
 
 void
 dont_repeat (void)
 {
-  if (server_command)
+  if (suppress_dont_repeat || server_command)
     return;
 
   /* If we aren't reading from standard input, we are saving the last
@@ -560,6 +565,19 @@ dont_repeat (void)
   if (instream == stdin)
     *line = 0;
 }
+
+/* Prevent dont_repeat from working, and return a cleanup that
+   restores the previous state.  */
+
+struct cleanup *
+prevent_dont_repeat (void)
+{
+  struct cleanup *result = make_cleanup_restore_integer (&suppress_dont_repeat);
+
+  suppress_dont_repeat = 1;
+  return result;
+}
+
 
 /* Read a line from the stream "instream" without command line editing.
 


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