diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim index d7c01aae97ca5f261a3ee801951a0de9daf42036..14af261713242800dd97715a85377a49ddf15a30 100644 --- 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 diff --git a/src/version.c b/src/version.c index 867eaf55f21e1f3de6c9b1d897c155489fcd5075..3c8b1431c51fc405e261a92cae7c1701ad12e306 100644 --- a/src/version.c +++ b/src/version.c @@ -754,6 +754,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1149, /**/ 1148, /**/ diff --git a/src/vim9compile.c b/src/vim9compile.c index c876da0751c6f1ae86e64807e6cb29d60fefc0f8..ff6668fe46ceca5ecf1031cc05c88c4a977b7bfe 100644 --- 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 set_return_type, cctx_T *outer_cctx) } // 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 set_return_type, cctx_T *outer_cctx) 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: