Skip to content

Commit

Permalink
patch 8.2.4499: Vim9: at the script level declarations leak to next b…
Browse files Browse the repository at this point in the history
…lock

Problem:    Vim9: at the script level declarations leak from try block to
            catch and finally block.
Solution:   End the block and start a new one. (closes #9883)
  • Loading branch information
brammool committed Mar 3, 2022
1 parent 1fc3422 commit 28bf649
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 0 deletions.
19 changes: 19 additions & 0 deletions src/ex_eval.c
Original file line number Diff line number Diff line change
Expand Up @@ -1827,6 +1827,16 @@ ex_catch(exarg_T *eap)
cstack->cs_flags[idx] |= CSF_ACTIVE | CSF_CAUGHT;
did_emsg = got_int = did_throw = FALSE;
catch_exception((except_T *)cstack->cs_exception[idx]);

if (cstack->cs_idx >= 0
&& (cstack->cs_flags[cstack->cs_idx] & CSF_TRY))
{
// Variables declared in the previous block can no longer be
// used.
leave_block(cstack);
enter_block(cstack);
}

// It's mandatory that the current exception is stored in the cstack
// so that it can be discarded at the next ":catch", ":finally", or
// ":endtry" or when the catch clause is left by a ":continue",
Expand Down Expand Up @@ -1930,6 +1940,15 @@ ex_finally(exarg_T *eap)
*/
cleanup_conditionals(cstack, CSF_TRY, FALSE);

if (cstack->cs_idx >= 0
&& (cstack->cs_flags[cstack->cs_idx] & CSF_TRY))
{
// Variables declared in the previous block can no longer be
// used.
leave_block(cstack);
enter_block(cstack);
}

/*
* Make did_emsg, got_int, did_throw pending. If set, they overrule
* a pending ":continue", ":break", ":return", or ":finish". Then
Expand Down
24 changes: 24 additions & 0 deletions src/testdir/test_vim9_script.vim
Original file line number Diff line number Diff line change
Expand Up @@ -763,6 +763,30 @@ def Test_try_catch_throw()
v9.CheckDefAndScriptSuccess(lines)
enddef

def Test_try_var_decl()
var lines =<< trim END
vim9script
try
var in_try = 1
assert_equal(1, get(s:, 'in_try', -1))
throw "getout"
catch
var in_catch = 2
assert_equal(-1, get(s:, 'in_try', -1))
assert_equal(2, get(s:, 'in_catch', -1))
finally
var in_finally = 3
assert_equal(-1, get(s:, 'in_try', -1))
assert_equal(-1, get(s:, 'in_catch', -1))
assert_equal(3, get(s:, 'in_finally', -1))
endtry
assert_equal(-1, get(s:, 'in_try', -1))
assert_equal(-1, get(s:, 'in_catch', -1))
assert_equal(-1, get(s:, 'in_finally', -1))
END
v9.CheckScriptSuccess(lines)
enddef

def Test_try_ends_in_return()
var lines =<< trim END
vim9script
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Original file line number Diff line number Diff line change
Expand Up @@ -754,6 +754,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
4499,
/**/
4498,
/**/
Expand Down

0 comments on commit 28bf649

Please sign in to comment.