From a7583c42cd6b64fd276a5d7bb0db5ce7bfafa730 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 7 May 2022 21:14:05 +0100 Subject: [PATCH] patch 8.2.4912: using execute() to define a lambda doesn't work Problem: Using execute() to define a lambda doesn't work. (Ernie Rael) Solution: Put the getline function in evalarg. (closes #10375) --- src/eval.c | 2 +- src/evalfunc.c | 2 +- src/proto/evalfunc.pro | 3 ++- src/testdir/test_vim9_func.vim | 20 ++++++++++++++++++++ src/version.c | 2 ++ 5 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/eval.c b/src/eval.c index 41094cd69f..4906fa6142 100644 --- a/src/eval.c +++ b/src/eval.c @@ -140,7 +140,7 @@ fill_evalarg_from_eap(evalarg_T *evalarg, exarg_T *eap, int skip) if (eap != NULL) { evalarg->eval_cstack = eap->cstack; - if (sourcing_a_script(eap)) + if (sourcing_a_script(eap) || eap->getline == get_list_line) { evalarg->eval_getline = eap->getline; evalarg->eval_cookie = eap->cookie; diff --git a/src/evalfunc.c b/src/evalfunc.c index 667d4f3467..efade6cab6 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -3868,7 +3868,7 @@ execute_cmds_from_string(char_u *str) * Called by do_cmdline() to get the next line. * Returns allocated string, or NULL for end of function. */ - static char_u * + char_u * get_list_line( int c UNUSED, void *cookie, diff --git a/src/proto/evalfunc.pro b/src/proto/evalfunc.pro index 4e9ad5b226..5103588d70 100644 --- a/src/proto/evalfunc.pro +++ b/src/proto/evalfunc.pro @@ -17,11 +17,12 @@ buf_T *get_buf_arg(typval_T *arg); win_T *get_optional_window(typval_T *argvars, int idx); void execute_redir_str(char_u *value, int value_len); void execute_cmds_from_string(char_u *str); +char_u *get_list_line(int c, void *cookie, int indent, getline_opt_T options); void execute_common(typval_T *argvars, typval_T *rettv, int arg_off); void f_exists(typval_T *argvars, typval_T *rettv); void f_has(typval_T *argvars, typval_T *rettv); -void f_len(typval_T *argvars, typval_T *rettv); int dynamic_feature(char_u *feature); +void f_len(typval_T *argvars, typval_T *rettv); void mzscheme_call_vim(char_u *name, typval_T *args, typval_T *rettv); void range_list_materialize(list_T *list); long do_searchpair(char_u *spat, char_u *mpat, char_u *epat, int dir, typval_T *skip, int flags, pos_T *match_pos, linenr_T lnum_stop, long time_limit); diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim index 5f42c1cfe7..14d0bce6f5 100644 --- a/src/testdir/test_vim9_func.vim +++ b/src/testdir/test_vim9_func.vim @@ -1615,6 +1615,26 @@ def Test_lambda_type_allocated() v9.CheckScriptSuccess(lines) enddef +def Test_define_lambda_in_execute() + var lines =<< trim [CODE] + vim9script + + def BuildFuncMultiLine(): func + var x =<< trim END + g:SomeRandomFunc = (d: dict) => { + return d.k1 + d.k2 + } + END + execute(x) + return g:SomeRandomFunc + enddef + var ResultPlus = BuildFuncMultiLine() + assert_equal(7, ResultPlus({k1: 3, k2: 4})) + [CODE] + v9.CheckScriptSuccess(lines) + unlet g:SomeRandomFunc +enddef + " Default arg and varargs def MyDefVarargs(one: string, two = 'foo', ...rest: list): string var res = one .. ',' .. two diff --git a/src/version.c b/src/version.c index 6009972d2e..ead455bbdc 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4912, /**/ 4911, /**/