changeset 21196:f45ce1ce284c v8.2.1149

patch 8.2.1149: Vim9: :eval command not handled properly Commit: https://github.com/vim/vim/commit/007f9d6ed597bd212acb95be9d0767c97d2a1438 Author: Bram Moolenaar <Bram@vim.org> Date: Mon Jul 6 23:04:49 2020 +0200 patch 8.2.1149: Vim9: :eval command not handled properly Problem: Vim9: :eval command not handled properly. Solution: Compile the :eval command. (closes https://github.com/vim/vim/issues/6408)
author Bram Moolenaar <Bram@vim.org>
date Mon, 06 Jul 2020 23:15:04 +0200
parents a5fcf0c62367
children d68512f02811
files src/testdir/test_vim9_cmd.vim src/version.c src/vim9compile.c
diffstat 3 files changed, 31 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_cmd.vim
+++ b/src/testdir/test_vim9_cmd.vim
@@ -248,5 +248,20 @@ def Test_bar_after_command()
   endif
 enddef
 
+def Test_eval_command()
+  let from = 3
+  let to = 5
+  g:val = 111
+  def Increment(nrs: list<number>)
+    for nr in nrs
+      g:val += nr
+    endfor
+  enddef
+  eval range(from, to)
+        ->Increment()
+  assert_equal(111 + 3 + 4 + 5, g:val)
+  unlet g:val
+enddef
+
 
 " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1149,
+/**/
     1148,
 /**/
     1147,
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -3852,7 +3852,6 @@ compile_expr7(
 			char_u *start = skipwhite(*arg + 1);
 
 			// Find out what comes after the arguments.
-			// TODO: pass getline function
 			ret = get_function_args(&start, '-', NULL,
 					   NULL, NULL, NULL, TRUE, NULL, NULL);
 			if (ret != FAIL && *start == '>')
@@ -6990,21 +6989,12 @@ compile_def_function(ufunc_T *ufunc, int
 	    }
 
 	    // Expression or function call.
-	    if (ea.cmdidx == CMD_eval)
+	    if (ea.cmdidx != CMD_eval)
 	    {
-		p = ea.cmd;
-		if (compile_expr0(&p, &cctx) == FAIL)
-		    goto erret;
-
-		// drop the return value
-		generate_instr_drop(&cctx, ISN_DROP, 1);
-
-		line = skipwhite(p);
-		continue;
+		// CMD_let cannot happen, compile_assignment() above is used
+		iemsg("Command from find_ex_command() not handled");
+		goto erret;
 	    }
-	    // CMD_let cannot happen, compile_assignment() above is used
-	    iemsg("Command from find_ex_command() not handled");
-	    goto erret;
 	}
 
 	p = skipwhite(p);
@@ -7124,6 +7114,16 @@ compile_def_function(ufunc_T *ufunc, int
 		    line = compile_throw(p, &cctx);
 		    break;
 
+	    case CMD_eval:
+		    if (compile_expr0(&p, &cctx) == FAIL)
+			goto erret;
+
+		    // drop the return value
+		    generate_instr_drop(&cctx, ISN_DROP, 1);
+
+		    line = skipwhite(p);
+		    break;
+
 	    case CMD_echo:
 	    case CMD_echon:
 	    case CMD_execute: