diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-06-27 18:06:45 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-06-27 18:06:45 +0200 |
commit | e40fbc2ca9fda07332a4da5af1fcaba91bed865b (patch) | |
tree | 66b7aa861de9c07cc5d04c5647f0bee8d61cb19e /src/userfunc.c | |
parent | ab19d495fd880b25a38d58cbeb5b21e4d0ee5835 (diff) | |
download | vim-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.c | 32 |
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; |