# HG changeset patch # User Bram Moolenaar # Date 1581018303 -3600 # Node ID d6e8a9e80be40934222a98351a0f919e46101426 # Parent fbd4e8f02f82c080e2cc90150d950b29a3ce2fd8 patch 8.2.0224: compiling :elseif not tested yet Commit: https://github.com/vim/vim/commit/158906cffc62bc82bc38198c2104967f2a70542c Author: Bram Moolenaar Date: Thu Feb 6 20:39:45 2020 +0100 patch 8.2.0224: compiling :elseif not tested yet Problem: compiling :elseif not tested yet. Solution: Add test for :elseif. Fix generating jumps. diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim --- 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 --- 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' + res = "three" endif + return res enddef -def HasNothing() - if has('nothing') - echo 'yes' - else - echo 'no' - endif -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 --- 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 --- 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; } }