From 007f9d6ed597bd212acb95be9d0767c97d2a1438 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar <Bram@vim.org> Date: Mon, 6 Jul 2020 23:04:49 +0200 Subject: [PATCH] patch 8.2.1149: Vim9: :eval command not handled properly Problem: Vim9: :eval command not handled properly. Solution: Compile the :eval command. (closes #6408) --- src/testdir/test_vim9_cmd.vim | 15 +++++++++++++++ src/version.c | 2 ++ src/vim9compile.c | 28 ++++++++++++++-------------- 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim index d7c01aae97..14af261713 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 867eaf55f2..3c8b1431c5 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 c876da0751..ff6668fe46 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: -- GitLab