mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-08-06 14:49:38 +08:00
Fix PR 20559 - "eval" command and $arg0...$arg9/$argc substitution
It'd be handy to be able to iterate over command arguments in user-defined commands, in order to support optional arguments ($arg0..$argN). I thought I could make it work with "eval", but alas, it doesn't work currently. E.g., with: define test set $i = 0 while $i < $argc eval "print $arg%d", $i set $i = $i + 1 end end we get: (gdb) test 1 $1 = void (gdb) test 1 2 3 $2 = void $3 = void $4 = void (gdb) The problem is that "eval" doesn't do user-defined command arguments substitution after expanding its own argument. This patch fixes that, which makes the example above work: (gdb) test 1 $1 = 1 (gdb) test 1 2 3 $2 = 1 $3 = 2 $4 = 3 (gdb) New test included, similar the above, but also exercises expanding $argc. I think this is likely to simplify many scripts out there, so I'm adding an example to the manual and mentioning it in NEWS as well. gdb/ChangeLog: 2016-12-02 Pedro Alves <palves@redhat.com> PR cli/20559 * NEWS: Mention "eval" expands user-defined command arguments. * cli/cli-script.c (execute_control_command): Adjust to rename. (insert_args): Rename to ... (insert_user_defined_cmd_args): ... this, and make extern. * cli/cli-script.h (insert_user_defined_cmd_args): New declaration. * printcmd.c: Include "cli/cli-script.h". (eval_command): Call insert_user_defined_cmd_args. gdb/doc/ChangeLog: 2016-12-02 Pedro Alves <palves@redhat.com> PR cli/20559 * gdb.texinfo (Define): Add example of using "eval" to process a variable number of arguments. (Output) <eval>: Add anchor. gdb/testsuite/ChangeLog: 2016-12-02 Pedro Alves <palves@redhat.com> PR cli/20559 * gdb.base/commands.exp (user_defined_command_args_eval): New procedure. (top level): Call it.
This commit is contained in:
@ -352,6 +352,36 @@ proc_with_prefix user_defined_command_test {} {
|
||||
"display user-defined empty command"
|
||||
}
|
||||
|
||||
# Test that "eval" in a user-defined command expands $argc/$argN.
|
||||
|
||||
proc_with_prefix user_defined_command_args_eval {} {
|
||||
global gdb_prompt
|
||||
|
||||
gdb_test_multiple "define command_args_eval" \
|
||||
"define command_args_eval" {
|
||||
-re "End with" {
|
||||
pass "define"
|
||||
}
|
||||
}
|
||||
|
||||
# Make a command that constructs references to $argc and $argN via
|
||||
# eval.
|
||||
gdb_test \
|
||||
[multi_line \
|
||||
{eval "printf \"argc = %%d,\", $arg%c", 'c'} \
|
||||
{set $i = 0} \
|
||||
{while $i < $argc} \
|
||||
{ eval "printf \" %%d\", $arg%d", $i} \
|
||||
{ set $i = $i + 1} \
|
||||
{end} \
|
||||
{printf "\n"} \
|
||||
{end}] \
|
||||
"" \
|
||||
"enter commands"
|
||||
|
||||
gdb_test "command_args_eval 1 2 3" "argc = 3, 1 2 3" "execute command"
|
||||
}
|
||||
|
||||
proc_with_prefix watchpoint_command_test {} {
|
||||
global gdb_prompt
|
||||
|
||||
@ -882,6 +912,7 @@ if_while_breakpoint_command_test
|
||||
infrun_breakpoint_command_test
|
||||
breakpoint_command_test
|
||||
user_defined_command_test
|
||||
user_defined_command_args_eval
|
||||
watchpoint_command_test
|
||||
test_command_prompt_position
|
||||
deprecated_command_test
|
||||
|
Reference in New Issue
Block a user