Add set_repeat_arguments function
The "x", "list", and "show commands" commands have special repetition behavior: repeating the command doesn't re-run it with the same arguments This is currently 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 "set_repeat_arguments" function and changes the relevant places to call it. gdb/ChangeLog 2017-11-07 Tom Tromey <tom@tromey.com> * printcmd.c (x_command): Call set_repeat_arguments. * cli/cli-cmds.c (list_command): Call set_repeat_arguments. * top.c (repeat_arguments): New global. (set_repeat_arguments): New function. (execute_command): Handle repeat_arguments. (show_commands): Calls set_repeat_arguments. * command.h (set_repeat_arguments): Declare.
This commit is contained in:
parent
022643b445
commit
85c4be7c83
6 changed files with 42 additions and 11 deletions
|
@ -1,3 +1,13 @@
|
||||||
|
2017-11-07 Tom Tromey <tom@tromey.com>
|
||||||
|
|
||||||
|
* printcmd.c (x_command): Call set_repeat_arguments.
|
||||||
|
* cli/cli-cmds.c (list_command): Call set_repeat_arguments.
|
||||||
|
* top.c (repeat_arguments): New global.
|
||||||
|
(set_repeat_arguments): New function.
|
||||||
|
(execute_command): Handle repeat_arguments.
|
||||||
|
(show_commands): Calls set_repeat_arguments.
|
||||||
|
* command.h (set_repeat_arguments): Declare.
|
||||||
|
|
||||||
2017-11-07 Tom Tromey <tom@tromey.com>
|
2017-11-07 Tom Tromey <tom@tromey.com>
|
||||||
|
|
||||||
* stack.c (backtrace_command): Use std::string.
|
* stack.c (backtrace_command): Use std::string.
|
||||||
|
|
|
@ -1082,7 +1082,7 @@ list_command (char *arg, int from_tty)
|
||||||
turn it into the no-arg variant. */
|
turn it into the no-arg variant. */
|
||||||
|
|
||||||
if (from_tty)
|
if (from_tty)
|
||||||
*arg = 0;
|
set_repeat_arguments ("");
|
||||||
|
|
||||||
if (dummy_beg && sal_end.symtab == 0)
|
if (dummy_beg && sal_end.symtab == 0)
|
||||||
error (_("No default source file yet. Do \"help list\"."));
|
error (_("No default source file yet. Do \"help list\"."));
|
||||||
|
|
|
@ -445,6 +445,11 @@ extern void dont_repeat (void);
|
||||||
|
|
||||||
extern scoped_restore_tmpl<int> prevent_dont_repeat (void);
|
extern scoped_restore_tmpl<int> prevent_dont_repeat (void);
|
||||||
|
|
||||||
|
/* Set the arguments that will be passed if the current command is
|
||||||
|
repeated. Note that the passed-in string must be a constant. */
|
||||||
|
|
||||||
|
extern void set_repeat_arguments (const char *args);
|
||||||
|
|
||||||
/* Used to mark commands that don't do anything. If we just leave the
|
/* 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
|
function field NULL, the command is interpreted as a help topic, or
|
||||||
as a class of commands. */
|
as a class of commands. */
|
||||||
|
|
|
@ -1646,7 +1646,7 @@ x_command (char *exp, int from_tty)
|
||||||
repeated with Newline. But don't clobber a user-defined
|
repeated with Newline. But don't clobber a user-defined
|
||||||
command's definition. */
|
command's definition. */
|
||||||
if (from_tty)
|
if (from_tty)
|
||||||
*exp = 0;
|
set_repeat_arguments ("");
|
||||||
val = evaluate_expression (expr.get ());
|
val = evaluate_expression (expr.get ());
|
||||||
if (TYPE_IS_REFERENCE (value_type (val)))
|
if (TYPE_IS_REFERENCE (value_type (val)))
|
||||||
val = coerce_ref (val);
|
val = coerce_ref (val);
|
||||||
|
|
29
gdb/top.c
29
gdb/top.c
|
@ -522,6 +522,19 @@ maybe_wait_sync_command_done (int was_sync)
|
||||||
wait_sync_command_done ();
|
wait_sync_command_done ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If not NULL, the arguments that should be passed if the current
|
||||||
|
command is repeated. */
|
||||||
|
|
||||||
|
static const char *repeat_arguments;
|
||||||
|
|
||||||
|
/* See command.h. */
|
||||||
|
|
||||||
|
void
|
||||||
|
set_repeat_arguments (const char *args)
|
||||||
|
{
|
||||||
|
repeat_arguments = args;
|
||||||
|
}
|
||||||
|
|
||||||
/* Execute the line P as a command, in the current user context.
|
/* Execute the line P as a command, in the current user context.
|
||||||
Pass FROM_TTY as second argument to the defining function. */
|
Pass FROM_TTY as second argument to the defining function. */
|
||||||
|
|
||||||
|
@ -564,6 +577,10 @@ execute_command (char *p, int from_tty)
|
||||||
c = lookup_cmd (&cmd, cmdlist, "", 0, 1);
|
c = lookup_cmd (&cmd, cmdlist, "", 0, 1);
|
||||||
p = (char *) cmd;
|
p = (char *) cmd;
|
||||||
|
|
||||||
|
scoped_restore save_repeat_args
|
||||||
|
= make_scoped_restore (&repeat_arguments, nullptr);
|
||||||
|
char *args_pointer = p;
|
||||||
|
|
||||||
/* Pass null arg rather than an empty one. */
|
/* Pass null arg rather than an empty one. */
|
||||||
arg = *p ? p : 0;
|
arg = *p ? p : 0;
|
||||||
|
|
||||||
|
@ -612,6 +629,11 @@ execute_command (char *p, int from_tty)
|
||||||
/* If this command has been post-hooked, run the hook last. */
|
/* If this command has been post-hooked, run the hook last. */
|
||||||
execute_cmd_post_hook (c);
|
execute_cmd_post_hook (c);
|
||||||
|
|
||||||
|
if (repeat_arguments != NULL)
|
||||||
|
{
|
||||||
|
gdb_assert (strlen (args_pointer) >= strlen (repeat_arguments));
|
||||||
|
strcpy (args_pointer, repeat_arguments);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
check_frame_language_change ();
|
check_frame_language_change ();
|
||||||
|
@ -1667,7 +1689,7 @@ dont_repeat_command (char *ignored, int from_tty)
|
||||||
/* Number of commands to print in each call to show_commands. */
|
/* Number of commands to print in each call to show_commands. */
|
||||||
#define Hist_print 10
|
#define Hist_print 10
|
||||||
void
|
void
|
||||||
show_commands (char *args, int from_tty)
|
show_commands (const char *args, int from_tty)
|
||||||
{
|
{
|
||||||
/* Index for history commands. Relative to history_base. */
|
/* Index for history commands. Relative to history_base. */
|
||||||
int offset;
|
int offset;
|
||||||
|
@ -1721,10 +1743,7 @@ show_commands (char *args, int from_tty)
|
||||||
"show commands +" does. This is unnecessary if arg is null,
|
"show commands +" does. This is unnecessary if arg is null,
|
||||||
because "show commands +" is not useful after "show commands". */
|
because "show commands +" is not useful after "show commands". */
|
||||||
if (from_tty && args)
|
if (from_tty && args)
|
||||||
{
|
set_repeat_arguments ("+");
|
||||||
args[0] = '+';
|
|
||||||
args[1] = '\0';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update the size of our command history file to HISTORY_SIZE.
|
/* Update the size of our command history file to HISTORY_SIZE.
|
||||||
|
|
|
@ -2003,10 +2003,7 @@ show_values (char *num_exp, int from_tty)
|
||||||
"show values +". If num_exp is null, this is unnecessary, since
|
"show values +". If num_exp is null, this is unnecessary, since
|
||||||
"show values +" is not useful after "show values". */
|
"show values +" is not useful after "show values". */
|
||||||
if (from_tty && num_exp)
|
if (from_tty && num_exp)
|
||||||
{
|
set_repeat_arguments ("+");
|
||||||
num_exp[0] = '+';
|
|
||||||
num_exp[1] = '\0';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
enum internalvar_kind
|
enum internalvar_kind
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue