forked from aniani/vim
patch 8.2.2602: Vim9: continue doesn't work if :while is very first command
Problem: Vim9: continue doesn't work if :while is very first command. (Yegappan Lakshmanan) Solution: Add one to the continue instruction index.
This commit is contained in:
@@ -592,6 +592,31 @@ def Test_try_catch_throw()
|
|||||||
assert_equal(4, ReturnInFinally())
|
assert_equal(4, ReturnInFinally())
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
|
" :while at the very start of a function that :continue jumps to
|
||||||
|
def TryContinueFunc()
|
||||||
|
while g:Count < 2
|
||||||
|
g:sequence ..= 't'
|
||||||
|
try
|
||||||
|
echoerr 'Test'
|
||||||
|
catch
|
||||||
|
g:Count += 1
|
||||||
|
g:sequence ..= 'c'
|
||||||
|
continue
|
||||||
|
endtry
|
||||||
|
g:sequence ..= 'e'
|
||||||
|
g:Count += 1
|
||||||
|
endwhile
|
||||||
|
enddef
|
||||||
|
|
||||||
|
def Test_continue_in_try_in_while()
|
||||||
|
g:Count = 0
|
||||||
|
g:sequence = ''
|
||||||
|
TryContinueFunc()
|
||||||
|
assert_equal('tctc', g:sequence)
|
||||||
|
unlet g:Count
|
||||||
|
unlet g:sequence
|
||||||
|
enddef
|
||||||
|
|
||||||
def Test_nocatch_return_in_try()
|
def Test_nocatch_return_in_try()
|
||||||
# return in try block returns normally
|
# return in try block returns normally
|
||||||
def ReturnInTry(): string
|
def ReturnInTry(): string
|
||||||
|
@@ -750,6 +750,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
2602,
|
||||||
/**/
|
/**/
|
||||||
2601,
|
2601,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -30,7 +30,7 @@ typedef struct {
|
|||||||
int tcd_finally_idx; // instruction of the :finally block or zero
|
int tcd_finally_idx; // instruction of the :finally block or zero
|
||||||
int tcd_endtry_idx; // instruction of the :endtry
|
int tcd_endtry_idx; // instruction of the :endtry
|
||||||
int tcd_caught; // catch block entered
|
int tcd_caught; // catch block entered
|
||||||
int tcd_cont; // :continue encountered, jump here
|
int tcd_cont; // :continue encountered, jump here (minus one)
|
||||||
int tcd_return; // when TRUE return from end of :finally
|
int tcd_return; // when TRUE return from end of :finally
|
||||||
} trycmd_T;
|
} trycmd_T;
|
||||||
|
|
||||||
@@ -2757,7 +2757,9 @@ call_def_function(
|
|||||||
{
|
{
|
||||||
trycmd = ((trycmd_T *)trystack->ga_data)
|
trycmd = ((trycmd_T *)trystack->ga_data)
|
||||||
+ trystack->ga_len - i;
|
+ trystack->ga_len - i;
|
||||||
trycmd->tcd_cont = iidx;
|
// Add one to tcd_cont to be able to jump to
|
||||||
|
// instruction with index zero.
|
||||||
|
trycmd->tcd_cont = iidx + 1;
|
||||||
iidx = trycmd->tcd_finally_idx == 0
|
iidx = trycmd->tcd_finally_idx == 0
|
||||||
? trycmd->tcd_endtry_idx : trycmd->tcd_finally_idx;
|
? trycmd->tcd_endtry_idx : trycmd->tcd_finally_idx;
|
||||||
}
|
}
|
||||||
@@ -2811,7 +2813,7 @@ call_def_function(
|
|||||||
if (trycmd->tcd_cont != 0)
|
if (trycmd->tcd_cont != 0)
|
||||||
// handling :continue: jump to outer try block or
|
// handling :continue: jump to outer try block or
|
||||||
// start of the loop
|
// start of the loop
|
||||||
ectx.ec_iidx = trycmd->tcd_cont;
|
ectx.ec_iidx = trycmd->tcd_cont - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
Reference in New Issue
Block a user