diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-02-06 20:39:45 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-02-06 20:39:45 +0100 |
commit | 158906cffc62bc82bc38198c2104967f2a70542c (patch) | |
tree | a60633e5aad8372ecaef37dd4f3db3039dafbff1 /src | |
parent | 5cab73f8cca46d831fb9337b176493da2a55ed5d (diff) |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/testdir/test_vim9_disassemble.vim | 62 | ||||
-rw-r--r-- | src/testdir/test_vim9_script.vim | 36 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9compile.c | 5 |
4 files changed, 79 insertions, 26 deletions
diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim index 3345758032..b011342976 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 4b57bde0bd..892806f39a 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 e76bdea773..3cb8bc29fa 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 922618b0a0..1c76c8adb2 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; } } |