Patch 8.2.1099
Problem: Vim9: cannot use line break in :cexpr argument.
Solution: Check for line break.
Files: src/eval.c, src/testdir/test_vim9_script.vim
*** ../vim-8.2.1098/src/eval.c 2020-06-30 20:55:11.332334734 +0200
--- src/eval.c 2020-06-30 21:17:39.048857842 +0200
***************
*** 153,158 ****
--- 153,170 ----
}
#endif
+ static void
+ fill_evalarg_from_eap(evalarg_T *evalarg, exarg_T *eap, int skip)
+ {
+ CLEAR_FIELD(*evalarg);
+ evalarg->eval_flags = skip ? 0 : EVAL_EVALUATE;
+ if (eap != NULL && getline_equal(eap->getline, eap->cookie, getsourceline))
+ {
+ evalarg->eval_getline = eap->getline;
+ evalarg->eval_cookie = eap->cookie;
+ }
+ }
+
/*
* Top level evaluation function, returning a boolean.
* Sets "error" to TRUE if there was an error.
***************
*** 169,181 ****
varnumber_T retval = FALSE;
evalarg_T evalarg;
! CLEAR_FIELD(evalarg);
! evalarg.eval_flags = skip ? 0 : EVAL_EVALUATE;
! if (eap != NULL && getline_equal(eap->getline, eap->cookie, getsourceline))
! {
! evalarg.eval_getline = eap->getline;
! evalarg.eval_cookie = eap->cookie;
! }
if (skip)
++emsg_skip;
--- 181,187 ----
varnumber_T retval = FALSE;
evalarg_T evalarg;
! fill_evalarg_from_eap(&evalarg, eap, skip);
if (skip)
++emsg_skip;
***************
*** 335,347 ****
char_u *retval;
evalarg_T evalarg;
! CLEAR_FIELD(evalarg);
! evalarg.eval_flags = skip ? 0 : EVAL_EVALUATE;
! if (eap != NULL && getline_equal(eap->getline, eap->cookie, getsourceline))
! {
! evalarg.eval_getline = eap->getline;
! evalarg.eval_cookie = eap->cookie;
! }
if (skip)
++emsg_skip;
if (eval0(arg, &tv, eap, &evalarg) == FAIL || skip)
--- 341,347 ----
char_u *retval;
evalarg_T evalarg;
! fill_evalarg_from_eap(&evalarg, eap, skip);
if (skip)
++emsg_skip;
if (eval0(arg, &tv, eap, &evalarg) == FAIL || skip)
***************
*** 535,546 ****
eval_expr(char_u *arg, exarg_T *eap)
{
typval_T *tv;
tv = ALLOC_ONE(typval_T);
! if (tv != NULL && eval0(arg, tv, eap, &EVALARG_EVALUATE) == FAIL)
VIM_CLEAR(tv);
- clear_evalarg(&EVALARG_EVALUATE, eap);
return tv;
}
--- 535,549 ----
eval_expr(char_u *arg, exarg_T *eap)
{
typval_T *tv;
+ evalarg_T evalarg;
+
+ fill_evalarg_from_eap(&evalarg, eap, eap != NULL && eap->skip);
tv = ALLOC_ONE(typval_T);
! if (tv != NULL && eval0(arg, tv, eap, &evalarg) == FAIL)
VIM_CLEAR(tv);
+ clear_evalarg(&evalarg, eap);
return tv;
}
***************
*** 5239,5251 ****
int called_emsg_before = called_emsg;
evalarg_T evalarg;
! CLEAR_FIELD(evalarg);
! evalarg.eval_flags = eap->skip ? 0 : EVAL_EVALUATE;
! if (getline_equal(eap->getline, eap->cookie, getsourceline))
! {
! evalarg.eval_getline = eap->getline;
! evalarg.eval_cookie = eap->cookie;
! }
if (eap->skip)
++emsg_skip;
--- 5242,5248 ----
int called_emsg_before = called_emsg;
evalarg_T evalarg;
! fill_evalarg_from_eap(&evalarg, eap, eap != NULL && eap->skip);
if (eap->skip)
++emsg_skip;
*** ../vim-8.2.1098/src/testdir/test_vim9_script.vim 2020-06-30 20:55:11.336334711 +0200
--- src/testdir/test_vim9_script.vim 2020-06-30 21:08:36.935859185 +0200
***************
*** 599,604 ****
--- 599,618 ----
CheckScriptSuccess(lines)
enddef
+ def Test_cexpr_vimscript()
+ " only checks line continuation
+ set errorformat=File\ %f\ line\ %l
+ let lines =<< trim END
+ vim9script
+ cexpr 'File'
+ .. ' someFile' ..
+ ' line 19'
+ assert_equal(19, getqflist()[0].lnum)
+ END
+ CheckScriptSuccess(lines)
+ set errorformat&
+ enddef
+
if has('channel')
let someJob = test_null_job()
*** ../vim-8.2.1098/src/version.c 2020-06-30 20:55:11.336334711 +0200
--- src/version.c 2020-06-30 21:09:02.243723196 +0200
***************
*** 756,757 ****
--- 756,759 ----
{ /* Add new patch number below this line */
+ /**/
+ 1099,
/**/
--
Computers make very fast, very accurate, mistakes.
/// Bram Moolenaar -- Br...@Moolenaar.net --
http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features --
http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language --
http://www.Zimbu.org ///
\\\ help me help AIDS victims --
http://ICCF-Holland.org ///