patch 8.2.1071: Vim9: no line break allowed inside a lambda
Problem: Vim9: no line break allowed inside a lambda.
Solution: Handle line break inside a lambda in Vim9 script.
diff --git a/src/userfunc.c b/src/userfunc.c
index 537c9cc..b358ecb 100644
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -391,8 +391,10 @@
* 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 @@
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 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 @@
if (evaluate)
{
- int len, flags = 0;
+ int len;
+ int flags = 0;
char_u *p;
char_u *name = get_lambda_name();
@@ -464,7 +482,7 @@
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 @@
}
eval_lavars_used = old_eval_lavars;
+ vim_free(tofree);
return OK;
errret:
@@ -517,6 +536,7 @@
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 @@
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;