forked from aniani/vim
patch 8.2.3078: Vim9: profile test fails
Problem: Vim9: profile test fails. Solution: Make throw in :catch jump to :finally.
This commit is contained in:
@@ -803,6 +803,25 @@ def Test_try_catch_nested()
|
||||
endtry
|
||||
endtry
|
||||
assert_equal(['1', '2', '3', '4', '5', '6'], l)
|
||||
|
||||
l = []
|
||||
try
|
||||
try
|
||||
l->add('1')
|
||||
throw 'foo'
|
||||
l->add('x')
|
||||
catch
|
||||
l->add('2')
|
||||
throw 'bar'
|
||||
l->add('x')
|
||||
finally
|
||||
l->add('3')
|
||||
endtry
|
||||
l->add('x')
|
||||
catch /bar/
|
||||
l->add('4')
|
||||
endtry
|
||||
assert_equal(['1', '2', '3', '4'], l)
|
||||
enddef
|
||||
|
||||
def TryOne(): number
|
||||
|
@@ -755,6 +755,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
3078,
|
||||
/**/
|
||||
3077,
|
||||
/**/
|
||||
|
@@ -8397,10 +8397,17 @@ compile_finally(char_u *arg, cctx_T *cctx)
|
||||
this_instr = instr->ga_len;
|
||||
#ifdef FEAT_PROFILE
|
||||
if (cctx->ctx_compile_type == CT_PROFILE
|
||||
&& ((isn_T *)instr->ga_data)[instr->ga_len - 1]
|
||||
&& ((isn_T *)instr->ga_data)[this_instr - 1]
|
||||
.isn_type == ISN_PROF_START)
|
||||
{
|
||||
// jump to the profile start of the "finally"
|
||||
--this_instr;
|
||||
|
||||
// jump to the profile end above it
|
||||
if (this_instr > 0 && ((isn_T *)instr->ga_data)[this_instr - 1]
|
||||
.isn_type == ISN_PROF_END)
|
||||
--this_instr;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Fill in the "end" label in jumps at the end of the blocks.
|
||||
|
@@ -1577,7 +1577,7 @@ exec_instructions(ectx_T *ectx)
|
||||
while (index > 0)
|
||||
{
|
||||
trycmd = ((trycmd_T *)trystack->ga_data) + index - 1;
|
||||
if (!trycmd->tcd_in_catch)
|
||||
if (!trycmd->tcd_in_catch || trycmd->tcd_finally_idx != 0)
|
||||
break;
|
||||
// In the catch and finally block of this try we have to go up
|
||||
// one level.
|
||||
@@ -1586,9 +1586,16 @@ exec_instructions(ectx_T *ectx)
|
||||
}
|
||||
if (trycmd != NULL && trycmd->tcd_frame_idx == ectx->ec_frame_idx)
|
||||
{
|
||||
// jump to ":catch" or ":finally"
|
||||
trycmd->tcd_in_catch = TRUE;
|
||||
if (trycmd->tcd_in_catch)
|
||||
{
|
||||
// exception inside ":catch", jump to ":finally" once
|
||||
ectx->ec_iidx = trycmd->tcd_finally_idx;
|
||||
trycmd->tcd_finally_idx = 0;
|
||||
}
|
||||
else
|
||||
// jump to first ":catch"
|
||||
ectx->ec_iidx = trycmd->tcd_catch_idx;
|
||||
trycmd->tcd_in_catch = TRUE;
|
||||
did_throw = FALSE; // don't come back here until :endtry
|
||||
trycmd->tcd_did_throw = TRUE;
|
||||
}
|
||||
|
Reference in New Issue
Block a user