diff options
author | Bram Moolenaar <Bram@vim.org> | 2022-05-07 21:14:05 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-05-07 21:14:05 +0100 |
commit | a7583c42cd6b64fd276a5d7bb0db5ce7bfafa730 (patch) | |
tree | ee867b59f724d625198f985cb90cd84af7571b18 | |
parent | 249591057b4840785c50e41dd850efb8a8faf435 (diff) |
patch 8.2.4912: using execute() to define a lambda doesn't workv8.2.4912
Problem: Using execute() to define a lambda doesn't work. (Ernie Rael)
Solution: Put the getline function in evalarg. (closes #10375)
-rw-r--r-- | src/eval.c | 2 | ||||
-rw-r--r-- | src/evalfunc.c | 2 | ||||
-rw-r--r-- | src/proto/evalfunc.pro | 3 | ||||
-rw-r--r-- | src/testdir/test_vim9_func.vim | 20 | ||||
-rw-r--r-- | 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<any>) => { + 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>): 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 @@ -747,6 +747,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4912, +/**/ 4911, /**/ 4910, |