summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Brabandt <cb@256bit.org>2023-09-05 20:46:25 +0200
committerChristian Brabandt <cb@256bit.org>2023-09-05 20:53:46 +0200
commit00cb247465856eaa546c520b65cf0ccc753ee1cd (patch)
treee6925577888a5fa96c3fb5ae4b68dd8c02bc0d1d
parent28a60f898d5cd7023596b0e96a081b1573edc807 (diff)
patch 9.0.1876: Vim9: parsing commands with newlines wrongv9.0.1876
Problem: Vim9: parsing commands with newlines wrong Solution: Accept a '\n' for parsing lists and command arguments closes: #13015 closes: #13020 Signed-off-by: Christian Brabandt <cb@256bit.org>
-rw-r--r--src/ex_docmd.c2
-rw-r--r--src/list.c2
-rw-r--r--src/macros.h1
-rw-r--r--src/testdir/test_crash.vim1
-rw-r--r--src/testdir/test_usercommands.vim27
-rw-r--r--src/userfunc.c2
-rw-r--r--src/version.c2
7 files changed, 33 insertions, 4 deletions
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 10d979d493..d4b972a2ef 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -3954,7 +3954,7 @@ find_ex_command(
#ifdef FEAT_EVAL
if (eap->cmdidx < CMD_SIZE
&& vim9
- && !IS_WHITE_OR_NUL(*p) && *p != '\n' && *p != '!' && *p != '|'
+ && !IS_WHITE_NL_OR_NUL(*p) && *p != '!' && *p != '|'
&& (eap->cmdidx < 0 ||
(cmdnames[eap->cmdidx].cmd_argt & EX_NONWHITE_OK) == 0))
{
diff --git a/src/list.c b/src/list.c
index 6210fd6380..d1494c67d5 100644
--- a/src/list.c
+++ b/src/list.c
@@ -1592,7 +1592,7 @@ eval_list(char_u **arg, typval_T *rettv, evalarg_T *evalarg, int do_error)
had_comma = **arg == ',';
if (had_comma)
{
- if (vim9script && !IS_WHITE_OR_NUL((*arg)[1]) && (*arg)[1] != ']')
+ if (vim9script && !IS_WHITE_NL_OR_NUL((*arg)[1]) && (*arg)[1] != ']')
{
semsg(_(e_white_space_required_after_str_str), ",", *arg);
goto failret;
diff --git a/src/macros.h b/src/macros.h
index b41a81827e..d86097ced3 100644
--- a/src/macros.h
+++ b/src/macros.h
@@ -43,6 +43,7 @@
*/
#define VIM_ISWHITE(x) ((x) == ' ' || (x) == '\t')
#define IS_WHITE_OR_NUL(x) ((x) == ' ' || (x) == '\t' || (x) == NUL)
+#define IS_WHITE_NL_OR_NUL(x) ((x) == ' ' || (x) == '\t' || (x) == '\n' || (x) == NUL)
/*
* LINEEMPTY() - return TRUE if the line is empty
diff --git a/src/testdir/test_crash.vim b/src/testdir/test_crash.vim
index f7b528c3e9..aa30684291 100644
--- a/src/testdir/test_crash.vim
+++ b/src/testdir/test_crash.vim
@@ -62,7 +62,6 @@ func Test_crash1()
let file = 'crash/vim_regsub_both_poc'
let args = printf(cmn_args, vim, file)
- " using || because this poc causes vim to exit with exitstatus != 0
call term_sendkeys(buf, args ..
\ ' && echo "crash 7: [OK]" >> X_crash1_result.txt' .. "\<cr>")
call TermWait(buf, 1000)
diff --git a/src/testdir/test_usercommands.vim b/src/testdir/test_usercommands.vim
index 1e1856727a..e161ee63fe 100644
--- a/src/testdir/test_usercommands.vim
+++ b/src/testdir/test_usercommands.vim
@@ -772,6 +772,33 @@ func Test_usercmd_with_block()
END
call v9.CheckScriptFailure(lines, 'E1128:')
delcommand BadCommand
+
+ let lines =<< trim END
+ vim9script
+ command Cmd {
+ g:result = [1,
+ 2]
+ }
+ Cmd
+ END
+ call v9.CheckScriptSuccess(lines)
+ call assert_equal([1, 2], g:result)
+ delcommand Cmd
+ unlet! g:result
+
+ let lines =<< trim END
+ vim9script
+ command Cmd {
+ g:result = and(0x80,
+ 0x80)
+ }
+ Cmd
+ END
+ call v9.CheckScriptSuccess(lines)
+ call assert_equal(128, g:result)
+ delcommand Cmd
+ unlet! g:result
+
endfunc
func Test_delcommand_buffer()
diff --git a/src/userfunc.c b/src/userfunc.c
index 0ebd61872d..6638849dbb 100644
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -1879,7 +1879,7 @@ get_func_arguments(
argp = skipwhite(argp);
if (*argp != ',')
break;
- if (vim9script && !IS_WHITE_OR_NUL(argp[1]))
+ if (vim9script && !IS_WHITE_NL_OR_NUL(argp[1]))
{
if (evaluate)
semsg(_(e_white_space_required_after_str_str), ",", argp);
diff --git a/src/version.c b/src/version.c
index f09039c64d..db11876b30 100644
--- a/src/version.c
+++ b/src/version.c
@@ -700,6 +700,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1876,
+/**/
1875,
/**/
1874,