From patchwork Thu Dec 15 03:48:47 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 18471 Received: (qmail 3958 invoked by alias); 15 Dec 2016 03:49:07 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 3942 invoked by uid 89); 15 Dec 2016 03:49:06 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.4 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS autolearn=no version=3.3.2 spammy=surprise X-HELO: gproxy5-pub.mail.unifiedlayer.com Received: from gproxy5-pub.mail.unifiedlayer.com (HELO gproxy5-pub.mail.unifiedlayer.com) (67.222.38.55) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with SMTP; Thu, 15 Dec 2016 03:48:55 +0000 Received: (qmail 32457 invoked by uid 0); 15 Dec 2016 03:48:54 -0000 Received: from unknown (HELO CMOut01) (10.0.90.82) by gproxy5.mail.unifiedlayer.com with SMTP; 15 Dec 2016 03:48:54 -0000 Received: from box522.bluehost.com ([74.220.219.122]) by CMOut01 with id L3op1u00m2f2jeq013osqn; Wed, 14 Dec 2016 20:48:52 -0700 X-Authority-Analysis: v=2.1 cv=U4oBU4bu c=1 sm=1 tr=0 a=GsOEXm/OWkKvwdLVJsfwcA==:117 a=GsOEXm/OWkKvwdLVJsfwcA==:17 a=L9H7d07YOLsA:10 a=9cW_t1CCXrUA:10 a=s5jvgZ67dGcA:10 a=n5n_aSjo0skA:10 a=zstS-IiYAAAA:8 a=7bY4uMYUFJyQHxGpirQA:9 a=4G6NA9xxw8l3yy4pmD5M:22 Received: from 174-16-137-90.hlrn.qwest.net ([174.16.137.90]:46182 helo=bapiya) by box522.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.86_1) (envelope-from ) id 1cHN2J-00031I-2s; Wed, 14 Dec 2016 20:48:51 -0700 From: Tom Tromey To: Tom Tromey Cc: gdb-patches@sourceware.org Subject: Re: [RFA 7/8] Use unique_xmalloc_ptr in execute_gdb_command References: <1480395946-10924-1-git-send-email-tom@tromey.com> <1480395946-10924-8-git-send-email-tom@tromey.com> <878ts2yi5m.fsf@tromey.com> Date: Wed, 14 Dec 2016 20:48:47 -0700 In-Reply-To: <878ts2yi5m.fsf@tromey.com> (Tom Tromey's message of "Mon, 28 Nov 2016 22:22:29 -0700") Message-ID: <87inqletsw.fsf@tromey.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1.50 (gnu/linux) MIME-Version: 1.0 X-BWhitelist: no X-Exim-ID: 1cHN2J-00031I-2s X-Source-Sender: 174-16-137-90.hlrn.qwest.net (bapiya) [174.16.137.90]:46182 X-Source-Auth: tom+tromey.com X-Email-Count: 3 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTIyLmJsdWVob3N0LmNvbQ== >>>>> "Tom" == Tom Tromey 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. Tom commit 1a638a680bae42954d4ebc896cb5828a9e27709b Author: Tom Tromey Date: Mon Nov 28 21:11:53 2016 -0700 Remove cleanups from execute_gdb_command This replaces a cleanup in execute_gdb_command with an instance of std::string. Testing showed that this originally missed a cleanup that was returned by prevent_dont_repeat. This version of the patch changes prevent_dont_repeat to be a class, avoiding a cleanup. 2016-12-14 Tom Tromey * top.c (prevent_dont_repeat): Now a constructor. * python/python.c (execute_gdb_command): Use std::string. Update. * guile/guile.c (gdbscm_execute_gdb_command): Update. * command.h (prevent_dont_repeat): Now a class, not a function. * breakpoint.c (bpstat_do_actions_1): Update. diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 023c112..576270d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2016-12-14 Tom Tromey + + * top.c (prevent_dont_repeat): Now a constructor. + * python/python.c (execute_gdb_command): Use std::string. + Update. + * guile/guile.c (gdbscm_execute_gdb_command): Update. + * command.h (prevent_dont_repeat): Now a class, not a function. + * breakpoint.c (bpstat_do_actions_1): Update. + 2016-12-13 Tom Tromey * value.h (value_freer::~value_freer): Call reset. diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 92aac3a..5af1dfa 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 (); + prevent_dont_repeat preventer (); /* This pointer will iterate over the list of bpstat's. */ bs = *bsp; diff --git a/gdb/command.h b/gdb/command.h index 965d91f..38ff38a 100644 --- a/gdb/command.h +++ b/gdb/command.h @@ -408,7 +408,17 @@ extern void error_no_arg (const char *) ATTRIBUTE_NORETURN; extern void dont_repeat (void); -extern struct cleanup *prevent_dont_repeat (void); +/* Prevent dont_repeat from doing anything. */ +class prevent_dont_repeat +{ + public: + + prevent_dont_repeat (); + + private: + + scoped_restore_tmpl m_save_suppress; +}; /* 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/guile/guile.c b/gdb/guile/guile.c index 9a126a1..599896b 100644 --- a/gdb/guile/guile.c +++ b/gdb/guile/guile.c @@ -332,7 +332,7 @@ gdbscm_execute_gdb_command (SCM command_scm, SCM rest) inner_cleanups = make_cleanup_restore_integer (¤t_ui->async); current_ui->async = 0; - prevent_dont_repeat (); + prevent_dont_repeat preventer (); if (to_string) to_string_res = execute_command_to_string (command, from_tty); else diff --git a/gdb/python/python.c b/gdb/python/python.c index 83b9805..cf9502d 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -601,8 +601,7 @@ execute_gdb_command (PyObject *self, PyObject *args, PyObject *kw) TRY { /* Copy the argument text in case the command modifies it. */ - char *copy = xstrdup (arg); - struct cleanup *cleanup = make_cleanup (xfree, copy); + std::string copy (arg); struct interp *interp; scoped_restore save_async = make_scoped_restore (¤t_ui->async, 0); @@ -614,12 +613,11 @@ execute_gdb_command (PyObject *self, PyObject *args, PyObject *kw) interp = interp_lookup (current_ui, "console"); current_uiout = interp_ui_out (interp); - prevent_dont_repeat (); + prevent_dont_repeat preventer (); if (to_string) - to_string_res = execute_command_to_string (copy, from_tty); + to_string_res = execute_command_to_string (©[0], from_tty); else - execute_command (copy, from_tty); - do_cleanups (cleanup); + execute_command (©[0], from_tty); } CATCH (except, RETURN_MASK_ALL) { diff --git a/gdb/top.c b/gdb/top.c index 7d8b6e8..1aa926b 100644 --- a/gdb/top.c +++ b/gdb/top.c @@ -757,13 +757,9 @@ dont_repeat (void) /* Prevent dont_repeat from working, and return a cleanup that restores the previous state. */ -struct cleanup * -prevent_dont_repeat (void) +prevent_dont_repeat::prevent_dont_repeat () +: m_save_suppress (&suppress_dont_repeat, 1) { - struct cleanup *result = make_cleanup_restore_integer (&suppress_dont_repeat); - - suppress_dont_repeat = 1; - return result; }