0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

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:
Bram Moolenaar
2021-06-30 20:39:15 +02:00
parent d3d8feeb89
commit 834193afd7
4 changed files with 39 additions and 4 deletions

View File

@@ -803,6 +803,25 @@ def Test_try_catch_nested()
endtry endtry
endtry endtry
assert_equal(['1', '2', '3', '4', '5', '6'], l) 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 enddef
def TryOne(): number def TryOne(): number

View File

@@ -755,6 +755,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 */
/**/
3078,
/**/ /**/
3077, 3077,
/**/ /**/

View File

@@ -8397,10 +8397,17 @@ compile_finally(char_u *arg, cctx_T *cctx)
this_instr = instr->ga_len; this_instr = instr->ga_len;
#ifdef FEAT_PROFILE #ifdef FEAT_PROFILE
if (cctx->ctx_compile_type == CT_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) .isn_type == ISN_PROF_START)
{
// jump to the profile start of the "finally" // jump to the profile start of the "finally"
--this_instr; --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 #endif
// Fill in the "end" label in jumps at the end of the blocks. // Fill in the "end" label in jumps at the end of the blocks.

View File

@@ -1577,7 +1577,7 @@ exec_instructions(ectx_T *ectx)
while (index > 0) while (index > 0)
{ {
trycmd = ((trycmd_T *)trystack->ga_data) + index - 1; trycmd = ((trycmd_T *)trystack->ga_data) + index - 1;
if (!trycmd->tcd_in_catch) if (!trycmd->tcd_in_catch || trycmd->tcd_finally_idx != 0)
break; break;
// In the catch and finally block of this try we have to go up // In the catch and finally block of this try we have to go up
// one level. // one level.
@@ -1586,9 +1586,16 @@ exec_instructions(ectx_T *ectx)
} }
if (trycmd != NULL && trycmd->tcd_frame_idx == ectx->ec_frame_idx) if (trycmd != NULL && trycmd->tcd_frame_idx == ectx->ec_frame_idx)
{ {
// jump to ":catch" or ":finally" if (trycmd->tcd_in_catch)
trycmd->tcd_in_catch = TRUE; {
// 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; ectx->ec_iidx = trycmd->tcd_catch_idx;
trycmd->tcd_in_catch = TRUE;
did_throw = FALSE; // don't come back here until :endtry did_throw = FALSE; // don't come back here until :endtry
trycmd->tcd_did_throw = TRUE; trycmd->tcd_did_throw = TRUE;
} }