changeset 19332:d6e8a9e80be4 v8.2.0224

patch 8.2.0224: compiling :elseif not tested yet Commit: https://github.com/vim/vim/commit/158906cffc62bc82bc38198c2104967f2a70542c Author: Bram Moolenaar <Bram@vim.org> 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.
author Bram Moolenaar <Bram@vim.org>
date Thu, 06 Feb 2020 20:45:03 +0100
parents fbd4e8f02f82
children 2de8257d69b8
files src/testdir/test_vim9_disassemble.vim src/testdir/test_vim9_script.vim src/version.c src/vim9compile.c
diffstat 4 files changed, 79 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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
 
 
--- 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,
--- 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;
 	}
     }