diff options
-rw-r--r-- | gdb/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/cli/cli-script.c | 21 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/py-cmd.exp | 32 |
4 files changed, 62 insertions, 4 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b47226bc..4cd7aad 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2017-06-30 Sergio Durigan Junior <sergiodj@redhat.com> + + PR cli/21688 + * cli/cli-script.c (command_name_equals_not_inline): New function. + (process_next_line): Adjust 'if' clauses for "python", "compile" + and "guile" to use command_name_equals_not_inline. + 2017-06-29 Pedro Alves <palves@redhat.com> * completer.c (expression_completer): Call diff --git a/gdb/cli/cli-script.c b/gdb/cli/cli-script.c index e0e27ef..72f316f 100644 --- a/gdb/cli/cli-script.c +++ b/gdb/cli/cli-script.c @@ -900,6 +900,20 @@ command_name_equals (struct cmd_list_element *cmd, const char *name) && strcmp (cmd->name, name) == 0); } +/* Return true if NAME is the only command between COMMAND_START and + COMMAND_END. This is useful when we want to know whether the + command is inline (i.e., has arguments like 'python command1') or + is the start of a multi-line command block. */ + +static bool +command_name_equals_not_inline (const char *command_start, + const char *command_end, + const char *name) +{ + return (command_end - command_start == strlen (name) + && startswith (command_start, name)); +} + /* Given an input line P, skip the command and return a pointer to the first argument. */ @@ -997,21 +1011,20 @@ process_next_line (char *p, struct command_line **command, int parse_commands, { *command = build_command_line (commands_control, line_first_arg (p)); } - else if (command_name_equals (cmd, "python")) + else if (command_name_equals_not_inline (p_start, p_end, "python")) { /* Note that we ignore the inline "python command" form here. */ *command = build_command_line (python_control, ""); } - else if (command_name_equals (cmd, "compile")) + else if (command_name_equals_not_inline (p_start, p_end, "compile")) { /* Note that we ignore the inline "compile command" form here. */ *command = build_command_line (compile_control, ""); (*command)->control_u.compile.scope = COMPILE_I_INVALID_SCOPE; } - - else if (command_name_equals (cmd, "guile")) + else if (command_name_equals_not_inline (p_start, p_end, "guile")) { /* Note that we ignore the inline "guile command" form here. */ *command = build_command_line (guile_control, ""); diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 41c5434..06bf5a4 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2017-06-30 Sergio Durigan Junior <sergiodj@redhat.com> + + PR cli/21688 + * gdb.python/py-cmd.exp (test_python_inline_or_multiline): New + procedure. Call it. + 2017-06-29 Pedro Alves <palves@redhat.com> * gdb.base/printcmds.exp: Add tests. diff --git a/gdb/testsuite/gdb.python/py-cmd.exp b/gdb/testsuite/gdb.python/py-cmd.exp index 2dbf23ce..39bb785 100644 --- a/gdb/testsuite/gdb.python/py-cmd.exp +++ b/gdb/testsuite/gdb.python/py-cmd.exp @@ -181,6 +181,38 @@ gdb_test "complete expr_test bar\." \ "expr_test bar\.bc.*expr_test bar\.ij.*" \ "test completion through complete command" +# Test that the "python" command is correctly recognized as +# inline/multi-line when entering a sequence of commands. +# +# This proc tests PR cli/21688. The PR is not language-specific, but +# the easiest way is just to test with Python. +proc test_python_inline_or_multiline { } { + set define_cmd_not_inline { + { "if 1" " >$" "multi-line if 1" } + { "python" " >$" "multi-line python command" } + { "print ('hello')" " >$" "multi-line print" } + { "end" " >$" "multi-line first end" } + { "end" "hello\r\n" "multi-line last end" } } + + set define_cmd_inline { + { "if 1" " >$" "inline if 1" } + { "python print ('hello')" " >$" "inline python command" } + { "end" "hello\r\n" "inline end" } } + + foreach t [list $define_cmd_not_inline $define_cmd_inline] { + foreach l $t { + lassign $l command regex testmsg + gdb_test_multiple "$command" "$testmsg" { + -re "$regex" { + pass "$testmsg" + } + } + } + } +} + +test_python_inline_or_multiline + if { [readline_is_used] } { set test "complete 'expr_test bar.i'" send_gdb "expr_test bar\.i\t\t" |