summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-07-06 23:04:49 +0200
committerBram Moolenaar <Bram@vim.org>2020-07-06 23:04:49 +0200
commit007f9d6ed597bd212acb95be9d0767c97d2a1438 (patch)
treeb3a0391bd37c5251c457a3e199d9a772f2ebc80d
parentcbb6bdcd8967edc8ad123746d27ec30ccc7c1718 (diff)
patch 8.2.1149: Vim9: :eval command not handled properlyv8.2.1149
Problem: Vim9: :eval command not handled properly. Solution: Compile the :eval command. (closes #6408)
-rw-r--r--src/testdir/test_vim9_cmd.vim15
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c28
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
@@ -755,6 +755,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1149,
+/**/
1148,
/**/
1147,
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: