Mercurial > vim
changeset 28775:7fd3a9f05037 v8.2.4912
patch 8.2.4912: using execute() to define a lambda doesn't work
Commit: https://github.com/vim/vim/commit/a7583c42cd6b64fd276a5d7bb0db5ce7bfafa730
Author: Bram Moolenaar <Bram@vim.org>
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)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 07 May 2022 22:15:03 +0200 |
parents | 238e79812a48 |
children | 0a39be512722 |
files | src/eval.c src/evalfunc.c src/proto/evalfunc.pro src/testdir/test_vim9_func.vim src/version.c |
diffstat | 5 files changed, 26 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- 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;
--- 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,
--- 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);
--- 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