summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-02-06 20:39:45 +0100
committerBram Moolenaar <Bram@vim.org>2020-02-06 20:39:45 +0100
commit158906cffc62bc82bc38198c2104967f2a70542c (patch)
treea60633e5aad8372ecaef37dd4f3db3039dafbff1
parent5cab73f8cca46d831fb9337b176493da2a55ed5d (diff)
downloadvim-git-158906cffc62bc82bc38198c2104967f2a70542c.tar.gz
patch 8.2.0224: compiling :elseif not tested yetv8.2.0224
Problem: compiling :elseif not tested yet. Solution: Add test for :elseif. Fix generating jumps.
-rw-r--r--src/testdir/test_vim9_disassemble.vim62
-rw-r--r--src/testdir/test_vim9_script.vim36
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c5
4 files changed, 79 insertions, 26 deletions
diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim
index 334575803..b01134297 100644
--- a/src/testdir/test_vim9_disassemble.vim
+++ b/src/testdir/test_vim9_disassemble.vim
@@ -216,5 +216,67 @@ def Test_disassembleCall()
\, res)
enddef
+def HasEval()
+ if has("eval")
+ echo "yes"
+ else
+ echo "no"
+ endif
+enddef
+
+def HasNothing()
+ if has("nothing")
+ echo "yes"
+ else
+ echo "no"
+ endif
+enddef
+
+def HasSomething()
+ if has("nothing")
+ echo "nothing"
+ elseif has("something")
+ echo "something"
+ elseif has("eval")
+ echo "eval"
+ elseif has("less")
+ echo "less"
+ endif
+enddef
+
+def Test_compile_const_expr()
+ assert_equal("\nyes", execute('call HasEval()'))
+ let instr = execute('disassemble HasEval')
+ assert_match('HasEval.*'
+ \ .. 'if has("eval").*'
+ \ .. ' PUSHS "yes".*'
+ \, instr)
+ assert_notmatch('JUMP', instr)
+
+ assert_equal("\nno", execute('call HasNothing()'))
+ instr = execute('disassemble HasNothing')
+ assert_match('HasNothing.*'
+ \ .. 'if has("nothing").*'
+ \ .. 'else.*'
+ \ .. ' PUSHS "no".*'
+ \, instr)
+ assert_notmatch('PUSHS "yes"', instr)
+ assert_notmatch('JUMP', instr)
+
+ assert_equal("\neval", execute('call HasSomething()'))
+ instr = execute('disassemble HasSomething')
+ assert_match('HasSomething.*'
+ \ .. 'if has("nothing").*'
+ \ .. 'elseif has("something").*'
+ \ .. 'elseif has("eval").*'
+ \ .. ' PUSHS "eval".*'
+ \ .. 'elseif has("less").*'
+ \, instr)
+ assert_notmatch('PUSHS "nothing"', instr)
+ assert_notmatch('PUSHS "something"', instr)
+ assert_notmatch('PUSHS "less"', instr)
+ assert_notmatch('JUMP', instr)
+enddef
+
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim
index 4b57bde0b..892806f39 100644
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -459,34 +459,22 @@ def do_something():
EOF
endfunc
-def HasEval()
- if has('eval')
- echo 'yes'
+def IfElse(what: number): string
+ let res = ''
+ if what == 1
+ res = "one"
+ elseif what == 2
+ res = "two"
else
- echo 'no'
- endif
-enddef
-
-def HasNothing()
- if has('nothing')
- echo 'yes'
- else
- echo 'no'
+ res = "three"
endif
+ return res
enddef
-def Test_compile_const_expr()
- assert_equal("\nyes", execute('call HasEval()'))
- let instr = execute('disassemble HasEval')
- assert_match('PUSHS "yes"', instr)
- assert_notmatch('PUSHS "no"', instr)
- assert_notmatch('JUMP', instr)
-
- assert_equal("\nno", execute('call HasNothing()'))
- instr = execute('disassemble HasNothing')
- assert_notmatch('PUSHS "yes"', instr)
- assert_match('PUSHS "no"', instr)
- assert_notmatch('JUMP', instr)
+def Test_if_elseif_else()
+ assert_equal('one', IfElse(1))
+ assert_equal('two', IfElse(2))
+ assert_equal('three', IfElse(3))
enddef
diff --git a/src/version.c b/src/version.c
index e76bdea77..3cb8bc29f 100644
--- a/src/version.c
+++ b/src/version.c
@@ -743,6 +743,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 224,
+/**/
223,
/**/
222,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 922618b0a..1c76c8adb 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -3891,7 +3891,7 @@ compile_elseif(char_u *arg, cctx_T *cctx)
}
cctx->ctx_locals.ga_len = scope->se_local_count;
- if (cctx->ctx_skip != TRUE)
+ if (cctx->ctx_skip == MAYBE)
{
if (compile_jump_to_end(&scope->se_u.se_if.is_end_label,
JUMP_ALWAYS, cctx) == FAIL)
@@ -3947,13 +3947,14 @@ compile_else(char_u *arg, cctx_T *cctx)
return NULL;
}
- if (cctx->ctx_skip != TRUE)
+ if (cctx->ctx_skip == MAYBE)
{
if (scope->se_u.se_if.is_if_label >= 0)
{
// previous "if" or "elseif" jumps here
isn = ((isn_T *)instr->ga_data) + scope->se_u.se_if.is_if_label;
isn->isn_arg.jump.jump_where = instr->ga_len;
+ scope->se_u.se_if.is_if_label = -1;
}
}