Problem: compiling :elseif not tested yet.
Solution: Add test for :elseif. Fix generating jumps.
\, 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
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
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 224,
/**/
223,
/**/
}
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)
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;
}
}