Problem: Vim9: profile test fails.
Solution: Make throw in :catch jump to :finally.
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
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 3078,
/**/
3077,
/**/
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.
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.
}
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;
- ectx->ec_iidx = trycmd->tcd_catch_idx;
did_throw = FALSE; // don't come back here until :endtry
trycmd->tcd_did_throw = TRUE;
}