* FYI: fix PR python/12216
@ 2011-01-28 17:48 Tom Tromey
0 siblings, 0 replies; only message in thread
From: Tom Tromey @ 2011-01-28 17:48 UTC (permalink / raw)
To: gdb-patches
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)
}
}
\f
+/* 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;
+}
+
\f
/* Read a line from the stream "instream" without command line editing.
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2011-01-28 17:11 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-01-28 17:48 FYI: fix PR python/12216 Tom Tromey
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).