summaryrefslogtreecommitdiff
path: root/src/userfunc.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-06-27 18:06:45 +0200
committerBram Moolenaar <Bram@vim.org>2020-06-27 18:06:45 +0200
commite40fbc2ca9fda07332a4da5af1fcaba91bed865b (patch)
tree66b7aa861de9c07cc5d04c5647f0bee8d61cb19e /src/userfunc.c
parentab19d495fd880b25a38d58cbeb5b21e4d0ee5835 (diff)
downloadvim-git-e40fbc2ca9fda07332a4da5af1fcaba91bed865b.tar.gz
patch 8.2.1071: Vim9: no line break allowed inside a lambdav8.2.1071
Problem: Vim9: no line break allowed inside a lambda. Solution: Handle line break inside a lambda in Vim9 script.
Diffstat (limited to 'src/userfunc.c')
-rw-r--r--src/userfunc.c32
1 files changed, 26 insertions, 6 deletions
diff --git a/src/userfunc.c b/src/userfunc.c
index 537c9ccd0..b358ecb38 100644
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -391,8 +391,10 @@ errret:
* Return OK or FAIL. Returns NOTDONE for dict or {expr}.
*/
int
-get_lambda_tv(char_u **arg, typval_T *rettv, int evaluate)
+get_lambda_tv(char_u **arg, typval_T *rettv, evalarg_T *evalarg)
{
+ int evaluate = evalarg != NULL
+ && (evalarg->eval_flags & EVAL_EVALUATE);
garray_T newargs;
garray_T newlines;
garray_T *pnewargs;
@@ -404,6 +406,8 @@ get_lambda_tv(char_u **arg, typval_T *rettv, int evaluate)
char_u *s, *e;
int *old_eval_lavars = eval_lavars_used;
int eval_lavars = FALSE;
+ int getnext;
+ char_u *tofree = NULL;
ga_init(&newargs);
ga_init(&newlines);
@@ -432,12 +436,25 @@ get_lambda_tv(char_u **arg, typval_T *rettv, int evaluate)
// Get the start and the end of the expression.
*arg = skipwhite(*arg + 1);
+ eval_next_non_blank(*arg, evalarg, &getnext);
+ if (getnext)
+ *arg = eval_next_line(evalarg);
s = *arg;
- ret = skip_expr(arg);
+ ret = skip_expr_concatenate(&s, arg, evalarg);
if (ret == FAIL)
goto errret;
+ if (evalarg != NULL)
+ {
+ // avoid that the expression gets freed when another line break follows
+ tofree = evalarg->eval_tofree;
+ evalarg->eval_tofree = NULL;
+ }
+
e = *arg;
*arg = skipwhite(*arg);
+ eval_next_non_blank(*arg, evalarg, &getnext);
+ if (getnext)
+ *arg = eval_next_line(evalarg);
if (**arg != '}')
{
semsg(_("E451: Expected }: %s"), *arg);
@@ -447,7 +464,8 @@ get_lambda_tv(char_u **arg, typval_T *rettv, int evaluate)
if (evaluate)
{
- int len, flags = 0;
+ int len;
+ int flags = 0;
char_u *p;
char_u *name = get_lambda_name();
@@ -464,7 +482,7 @@ get_lambda_tv(char_u **arg, typval_T *rettv, int evaluate)
goto errret;
// Add "return " before the expression.
- len = 7 + e - s + 1;
+ len = 7 + (int)(e - s) + 1;
p = alloc(len);
if (p == NULL)
goto errret;
@@ -510,6 +528,7 @@ get_lambda_tv(char_u **arg, typval_T *rettv, int evaluate)
}
eval_lavars_used = old_eval_lavars;
+ vim_free(tofree);
return OK;
errret:
@@ -517,6 +536,7 @@ errret:
ga_clear_strings(&newlines);
vim_free(fp);
vim_free(pt);
+ vim_free(tofree);
eval_lavars_used = old_eval_lavars;
return FAIL;
}
@@ -3925,8 +3945,8 @@ ex_call(exarg_T *eap)
dbg_check_breakpoint(eap);
// Handle a function returning a Funcref, Dictionary or List.
- if (handle_subscript(&arg, &rettv, eap->skip ? 0 : EVAL_EVALUATE,
- TRUE) == FAIL)
+ if (handle_subscript(&arg, &rettv,
+ eap->skip ? NULL : &EVALARG_EVALUATE, TRUE) == FAIL)
{
failed = TRUE;
break;