diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 4cd7aadd10..708025694c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2017-06-30 Sergio Durigan Junior + Pedro Alves + + PR cli/21688 + * cli/cli-script.c (command_name_equals_not_inline): Remove function. + (process_next_line): New variable 'inline_cmd'. + Adjust 'if' clauses for "python", "compile" and "guile" to use + 'command_name_equals' and check for '!inline_cmd'. + 2017-06-30 Sergio Durigan Junior PR cli/21688 diff --git a/gdb/cli/cli-script.c b/gdb/cli/cli-script.c index 72f316f86b..5674404cb6 100644 --- a/gdb/cli/cli-script.c +++ b/gdb/cli/cli-script.c @@ -900,20 +900,6 @@ 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. */ @@ -966,6 +952,8 @@ process_next_line (char *p, struct command_line **command, int parse_commands, const char *cmd_name = p; struct cmd_list_element *cmd = lookup_cmd_1 (&cmd_name, cmdlist, NULL, 1); + cmd_name = skip_spaces_const (cmd_name); + bool inline_cmd = *cmd_name != '\0'; /* If commands are parsed, we skip initial spaces. Otherwise, which is the case for Python commands and documentation @@ -1011,20 +999,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_not_inline (p_start, p_end, "python")) + else if (command_name_equals (cmd, "python") && !inline_cmd) { /* Note that we ignore the inline "python command" form here. */ *command = build_command_line (python_control, ""); } - else if (command_name_equals_not_inline (p_start, p_end, "compile")) + else if (command_name_equals (cmd, "compile") && !inline_cmd) { /* 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_not_inline (p_start, p_end, "guile")) + else if (command_name_equals (cmd, "guile") && !inline_cmd) { /* 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 06bf5a4490..6160c4b398 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2017-06-30 Sergio Durigan Junior + + PR cli/21688 + * gdb.python/py-cmd.exp (test_python_inline_or_multiline): Add new + tests for alias commands and trailing whitespace. + 2017-06-30 Sergio Durigan Junior PR cli/21688 diff --git a/gdb/testsuite/gdb.python/py-cmd.exp b/gdb/testsuite/gdb.python/py-cmd.exp index 39bb7850c3..953d52af4d 100644 --- a/gdb/testsuite/gdb.python/py-cmd.exp +++ b/gdb/testsuite/gdb.python/py-cmd.exp @@ -187,6 +187,8 @@ gdb_test "complete expr_test bar\." \ # 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 { } { + global gdb_prompt + set define_cmd_not_inline { { "if 1" " >$" "multi-line if 1" } { "python" " >$" "multi-line python command" } @@ -194,12 +196,43 @@ proc test_python_inline_or_multiline { } { { "end" " >$" "multi-line first end" } { "end" "hello\r\n" "multi-line last end" } } + # This also tests trailing whitespace on the command. + set define_cmd_alias_not_inline { + { "if 1" " >$" "multi-line if 1 alias" } + { "py " " >$" "multi-line python command alias" } + { "print ('hello')" " >$" "multi-line print alias" } + { "end" " >$" "multi-line first end alias" } + { "end" "hello\r\n" "multi-line last end alias" } } + + set define_cmd_alias_foo_not_inline { + { "alias foo=python" "\r\n" "multi-line alias foo" } + { "if 1" " >$" "multi-line if 1 alias foo" } + { "foo " " >$" "multi-line python command alias foo" } + { "print ('hello')" " >$" "multi-line print alias foo" } + { "end" " >$" "multi-line first end alias foo" } + { "end" "hello\r\n" "multi-line last end alias foo" } } + 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] { + set define_cmd_alias_inline { + { "if 1" " >$" "inline if 1 alias" } + { "py print ('hello')" " >$" "inline python command alias" } + { "end" "hello\r\n" "inline end alias" } } + + set define_cmd_alias_foo_inline { + { "if 1" " >$" "inline if 1 alias foo" } + { "foo print ('hello')" " >$" "inline python command alias foo" } + { "end" "hello\r\n" "inline end alias foo" } } + + foreach t [list $define_cmd_not_inline \ + $define_cmd_alias_not_inline \ + $define_cmd_alias_foo_not_inline \ + $define_cmd_inline \ + $define_cmd_alias_inline \ + $define_cmd_alias_foo_inline] { foreach l $t { lassign $l command regex testmsg gdb_test_multiple "$command" "$testmsg" {