This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [RFA 7/8] Use unique_xmalloc_ptr in execute_gdb_command
- From: Pedro Alves <palves at redhat dot com>
- To: Tom Tromey <tom at tromey dot com>
- Cc: gdb-patches at sourceware dot org
- Date: Tue, 20 Dec 2016 17:48:44 +0000
- Subject: Re: [RFA 7/8] Use unique_xmalloc_ptr in execute_gdb_command
- Authentication-results: sourceware.org; auth=none
- References: <1480395946-10924-1-git-send-email-tom@tromey.com> <1480395946-10924-8-git-send-email-tom@tromey.com> <878ts2yi5m.fsf@tromey.com> <87inqletsw.fsf@tromey.com>
On 12/15/2016 03:48 AM, Tom Tromey wrote:
>>>>>> "Tom" == Tom Tromey <tom@tromey.com> writes:
>
> Tom> To my surprise, this patch is broken.
> Tom> I must not have re-run the python tests locally after writing it :(
>
> Tom> The problem is that prevent_dont_repeat returns a cleanup, which is then
> Tom> left dangling after this patch.
>
> Here's the updated patch.
> I ran this one through the buildbot.
>
In some other local patch that I hadn't posted, I handled a similar
situation of save/restoring some global that we don't want to expose
by making the "make_cleanup_..." function return a scoped_restore, which
avoids having to create a new class. It seems a bit simpler that
creating a class to me, and maybe a tiny bit more efficient code-space
wise (rtti?) Did you consider this approach? In this case, it'd look
like this:
>From 3138a3fb72f76d0d1bb5a2e1db57e450c37dd43a Mon Sep 17 00:00:00 2001
From: Pedro Alves <palves@redhat.com>
Date: Tue, 20 Dec 2016 17:30:56 +0000
Subject: [PATCH] Return scoped_restore instead of cleanup
---
gdb/breakpoint.c | 2 +-
gdb/command.h | 2 +-
gdb/top.c | 16 ++++++----------
3 files changed, 8 insertions(+), 12 deletions(-)
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index d737cad..dc72986 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -4685,7 +4685,7 @@ bpstat_do_actions_1 (bpstat *bsp)
executing_breakpoint_commands = 1;
old_chain = make_cleanup (cleanup_executing_breakpoints, 0);
- prevent_dont_repeat ();
+ scoped_restore save_dont_repeat = prevent_dont_repeat ();
/* This pointer will iterate over the list of bpstat's. */
bs = *bsp;
diff --git a/gdb/command.h b/gdb/command.h
index 965d91f..7b87814 100644
--- a/gdb/command.h
+++ b/gdb/command.h
@@ -408,7 +408,7 @@ extern void error_no_arg (const char *) ATTRIBUTE_NORETURN;
extern void dont_repeat (void);
-extern struct cleanup *prevent_dont_repeat (void);
+extern scoped_restore_tmpl<bool> prevent_dont_repeat ();
/* 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
diff --git a/gdb/top.c b/gdb/top.c
index 7d8b6e8..280af71 100644
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -732,10 +732,10 @@ execute_command_to_string (char *p, int from_tty)
}
-/* When nonzero, cause dont_repeat to do nothing. This should only be
+/* When true, cause dont_repeat to do nothing. This should only be
set via prevent_dont_repeat. */
-static int suppress_dont_repeat = 0;
+static bool suppress_dont_repeat = false;
/* Commands call this if they do not want to be repeated by null lines. */
@@ -754,16 +754,12 @@ dont_repeat (void)
*saved_command_line = 0;
}
-/* Prevent dont_repeat from working, and return a cleanup that
+/* Prevent dont_repeat from working, and return a scoped restore that
restores the previous state. */
-
-struct cleanup *
-prevent_dont_repeat (void)
+scoped_restore_tmpl<bool>
+prevent_dont_repeat ()
{
- struct cleanup *result = make_cleanup_restore_integer (&suppress_dont_repeat);
-
- suppress_dont_repeat = 1;
- return result;
+ return make_scoped_restore (&suppress_dont_repeat, true);
}
--
2.5.5