From patchwork Fri Oct 13 20:59:49 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 23566 Received: (qmail 36652 invoked by alias); 13 Oct 2017 21:00:29 -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 35857 invoked by uid 89); 13 Oct 2017 21:00:04 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.3 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS autolearn=ham version=3.3.2 spammy=repeating X-HELO: gproxy6-pub.mail.unifiedlayer.com Received: from gproxy6-pub.mail.unifiedlayer.com (HELO gproxy6-pub.mail.unifiedlayer.com) (67.222.39.168) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 13 Oct 2017 21:00:01 +0000 Received: from cmgw3 (unknown [10.0.90.84]) by gproxy6.mail.unifiedlayer.com (Postfix) with ESMTP id D853D1E0648 for ; Fri, 13 Oct 2017 14:59:59 -0600 (MDT) Received: from box522.bluehost.com ([74.220.219.122]) by cmgw3 with id M8zw1w00X2f2jeq018zzn5; Fri, 13 Oct 2017 14:59:59 -0600 X-Authority-Analysis: v=2.2 cv=H76r+6Qi c=1 sm=1 tr=0 a=GsOEXm/OWkKvwdLVJsfwcA==:117 a=GsOEXm/OWkKvwdLVJsfwcA==:17 a=02M-m0pO-4AA:10 a=zstS-IiYAAAA:8 a=ejK7-ByR_T1EPBW7k2QA:9 a=4G6NA9xxw8l3yy4pmD5M:22 Received: from 184-96-33-178.hlrn.qwest.net ([184.96.33.178]:58848 helo=bapiya.localdomain) by box522.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.87) (envelope-from ) id 1e373k-002gg4-JU; Fri, 13 Oct 2017 14:59:56 -0600 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [RFA 7/8] Add truncate_repeat_arguments function Date: Fri, 13 Oct 2017 14:59:49 -0600 Message-Id: <20171013205950.22943-8-tom@tromey.com> In-Reply-To: <20171013205950.22943-1-tom@tromey.com> References: <20171013205950.22943-1-tom@tromey.com> X-BWhitelist: no X-Exim-ID: 1e373k-002gg4-JU X-Source-Sender: 184-96-33-178.hlrn.qwest.net (bapiya.localdomain) [184.96.33.178]:58848 X-Source-Auth: tom+tromey.com X-Email-Count: 8 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTIyLmJsdWVob3N0LmNvbQ== X-Local-Domain: yes The "x" and "list" commands have special repetition behavior: repeating the command doesn't re-run it with the same arguments, but rather advances (through memory or the program listing). This is currenty implemented by modifying the passed-in argument; but that won't work properly with const arguments (and seems pretty obscure besides). This patch adds a new "truncate_repeat_arguments" function and changes the relevant places to call it. 2017-10-13 Tom Tromey * printcmd.c (x_command): Call truncate_repeat_arguments. * cli/cli-cmds.c (list_command): Call truncate_repeat_arguments. * top.c (should_truncate_repeat_arguments): New global. (truncate_repeat_arguments): New function. (execute_command): Handle should_truncate_repeat_arguments. * command.h (truncate_repeat_arguments): Declare. --- gdb/ChangeLog | 9 +++++++++ gdb/cli/cli-cmds.c | 2 +- gdb/command.h | 5 +++++ gdb/printcmd.c | 2 +- gdb/top.c | 19 +++++++++++++++++++ 5 files changed, 35 insertions(+), 2 deletions(-) diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c index a1c308a38d..d45a7353db 100644 --- a/gdb/cli/cli-cmds.c +++ b/gdb/cli/cli-cmds.c @@ -1082,7 +1082,7 @@ list_command (char *arg, int from_tty) turn it into the no-arg variant. */ if (from_tty) - *arg = 0; + truncate_repeat_arguments (); if (dummy_beg && sal_end.symtab == 0) error (_("No default source file yet. Do \"help list\".")); diff --git a/gdb/command.h b/gdb/command.h index a99544563c..b590e897ed 100644 --- a/gdb/command.h +++ b/gdb/command.h @@ -445,6 +445,11 @@ extern void dont_repeat (void); extern scoped_restore_tmpl prevent_dont_repeat (void); +/* Truncate the arguments to the last command, so that a repetition of + the command sees no arguments. */ + +extern void truncate_repeat_arguments (); + /* 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/printcmd.c b/gdb/printcmd.c index 77a05e5d9f..3218b5ab51 100644 --- a/gdb/printcmd.c +++ b/gdb/printcmd.c @@ -1636,7 +1636,7 @@ x_command (char *exp, int from_tty) repeated with Newline. But don't clobber a user-defined command's definition. */ if (from_tty) - *exp = 0; + truncate_repeat_arguments (); val = evaluate_expression (expr.get ()); if (TYPE_IS_REFERENCE (value_type (val))) val = coerce_ref (val); diff --git a/gdb/top.c b/gdb/top.c index 3b3bbee4ac..be90ed6e30 100644 --- a/gdb/top.c +++ b/gdb/top.c @@ -528,6 +528,19 @@ maybe_wait_sync_command_done (int was_sync) wait_sync_command_done (); } +/* True if execute_command should truncate the arguments to the last + command, so that a repetition of the command sees no arguments. */ + +static int should_truncate_repeat_arguments; + +/* See command.h. */ + +void +truncate_repeat_arguments () +{ + should_truncate_repeat_arguments = 1; +} + /* Execute the line P as a command, in the current user context. Pass FROM_TTY as second argument to the defining function. */ @@ -571,6 +584,10 @@ execute_command (char *p, int from_tty) c = lookup_cmd (&cmd, cmdlist, "", 0, 1); p = (char *) cmd; + scoped_restore save_truncation + = make_scoped_restore (&should_truncate_repeat_arguments, 0); + char *args_pointer = p; + /* Pass null arg rather than an empty one. */ arg = *p ? p : 0; @@ -619,6 +636,8 @@ execute_command (char *p, int from_tty) /* If this command has been post-hooked, run the hook last. */ execute_cmd_post_hook (c); + if (should_truncate_repeat_arguments) + *args_pointer = '\0'; } check_frame_language_change ();