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:
@@ -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
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -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.
|
||||||
|
@@ -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)
|
||||||
|
{
|
||||||
|
// 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;
|
trycmd->tcd_in_catch = TRUE;
|
||||||
ectx->ec_iidx = trycmd->tcd_catch_idx;
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user