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
--- 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,