# HG changeset patch # User Bram Moolenaar # Date 1651954503 -7200 # Node ID 7fd3a9f05037e1e993266d7b52046754e3c644b1 # Parent 238e79812a4896a36a32b0f60a767dd028f22f5b patch 8.2.4912: using execute() to define a lambda doesn't work Commit: https://github.com/vim/vim/commit/a7583c42cd6b64fd276a5d7bb0db5ce7bfafa730 Author: Bram Moolenaar Date: Sat May 7 21:14:05 2022 +0100 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 https://github.com/vim/vim/issues/10375) diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -140,7 +140,7 @@ fill_evalarg_from_eap(evalarg_T *evalarg 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 --- 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 --- 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); +int dynamic_feature(char_u *feature); void f_len(typval_T *argvars, typval_T *rettv); -int dynamic_feature(char_u *feature); 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 --- 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 --- a/src/version.c +++ b/src/version.c @@ -747,6 +747,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4912, +/**/ 4911, /**/ 4910,