0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 8.2.3707: Vim9: constant expression of elseif not recognized

Problem:    Vim9: constant expression of elseif not recognized.
Solution:   Set instruction count before generating the expression.
This commit is contained in:
Bram Moolenaar 2021-11-30 20:57:38 +00:00
parent 42eba04522
commit 90770b746e
3 changed files with 37 additions and 7 deletions

View File

@ -2296,6 +2296,38 @@ def Test_debugged()
res)
enddef
def s:ElseifConstant()
if g:value
echo "one"
elseif true
echo "true"
elseif false
echo "false"
endif
enddef
def Test_debug_elseif_constant()
var res = execute('disass s:ElseifConstant')
assert_match('<SNR>\d*_ElseifConstant\_s*' ..
'if g:value\_s*' ..
'0 LOADG g:value\_s*' ..
'1 COND2BOOL\_s*' ..
'2 JUMP_IF_FALSE -> 6\_s*' ..
'echo "one"\_s*' ..
'3 PUSHS "one"\_s*' ..
'4 ECHO 1\_s*' ..
'elseif true\_s*' ..
'5 JUMP -> 8\_s*' ..
'echo "true"\_s*' ..
'6 PUSHS "true"\_s*' ..
'7 ECHO 1\_s*' ..
'elseif false\_s*' ..
'echo "false"\_s*' ..
'endif\_s*' ..
'\d RETURN void*',
res)
enddef
def s:DebugElseif()
var b = false
if b

View File

@ -753,6 +753,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
3707,
/**/
3706,
/**/

View File

@ -7785,7 +7785,7 @@ compile_elseif(char_u *arg, cctx_T *cctx)
{
char_u *p = arg;
garray_T *instr = &cctx->ctx_instr;
int instr_count = instr->ga_len;
int instr_count;
isn_T *isn;
scope_T *scope = cctx->ctx_scope;
ppconst_T ppconst;
@ -7871,19 +7871,15 @@ compile_elseif(char_u *arg, cctx_T *cctx)
cctx->ctx_skip = SKIP_UNKNOWN;
#ifdef FEAT_PROFILE
if (cctx->ctx_compile_type == CT_PROFILE)
{
// the previous block was skipped, need to profile this line
generate_instr(cctx, ISN_PROF_START);
instr_count = instr->ga_len;
}
#endif
if (cctx->ctx_compile_type == CT_DEBUG)
{
// the previous block was skipped, may want to debug this line
generate_instr_debug(cctx);
instr_count = instr->ga_len;
}
}
instr_count = instr->ga_len;
if (compile_expr1(&p, cctx, &ppconst) == FAIL)
{
clear_ppconst(&ppconst);