aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog9
-rw-r--r--gdb/cli/cli-script.c22
-rw-r--r--gdb/testsuite/ChangeLog6
-rw-r--r--gdb/testsuite/gdb.python/py-cmd.exp35
4 files changed, 54 insertions, 18 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 4cd7aad..7080256 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,4 +1,13 @@
2017-06-30 Sergio Durigan Junior <sergiodj@redhat.com>
+ Pedro Alves <palves@redhat.com>
+
+ 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 <sergiodj@redhat.com>
PR cli/21688
* cli/cli-script.c (command_name_equals_not_inline): New function.
diff --git a/gdb/cli/cli-script.c b/gdb/cli/cli-script.c
index 72f316f..5674404 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 06bf5a4..6160c4b 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,6 +1,12 @@
2017-06-30 Sergio Durigan Junior <sergiodj@redhat.com>
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 <sergiodj@redhat.com>
+
+ PR cli/21688
* gdb.python/py-cmd.exp (test_python_inline_or_multiline): New
procedure. Call it.
diff --git a/gdb/testsuite/gdb.python/py-cmd.exp b/gdb/testsuite/gdb.python/py-cmd.exp
index 39bb785..953d52a 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" {