mirror of
https://github.com/vim/vim.git
synced 2025-09-28 04:24:06 -04:00
patch 8.2.4499: Vim9: at the script level declarations leak to next block
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)
This commit is contained in:
@@ -1827,6 +1827,16 @@ ex_catch(exarg_T *eap)
|
|||||||
cstack->cs_flags[idx] |= CSF_ACTIVE | CSF_CAUGHT;
|
cstack->cs_flags[idx] |= CSF_ACTIVE | CSF_CAUGHT;
|
||||||
did_emsg = got_int = did_throw = FALSE;
|
did_emsg = got_int = did_throw = FALSE;
|
||||||
catch_exception((except_T *)cstack->cs_exception[idx]);
|
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
|
// It's mandatory that the current exception is stored in the cstack
|
||||||
// so that it can be discarded at the next ":catch", ":finally", or
|
// so that it can be discarded at the next ":catch", ":finally", or
|
||||||
// ":endtry" or when the catch clause is left by a ":continue",
|
// ":endtry" or when the catch clause is left by a ":continue",
|
||||||
@@ -1930,6 +1940,15 @@ ex_finally(exarg_T *eap)
|
|||||||
*/
|
*/
|
||||||
cleanup_conditionals(cstack, CSF_TRY, FALSE);
|
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
|
* Make did_emsg, got_int, did_throw pending. If set, they overrule
|
||||||
* a pending ":continue", ":break", ":return", or ":finish". Then
|
* a pending ":continue", ":break", ":return", or ":finish". Then
|
||||||
|
@@ -763,6 +763,30 @@ def Test_try_catch_throw()
|
|||||||
v9.CheckDefAndScriptSuccess(lines)
|
v9.CheckDefAndScriptSuccess(lines)
|
||||||
enddef
|
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()
|
def Test_try_ends_in_return()
|
||||||
var lines =<< trim END
|
var lines =<< trim END
|
||||||
vim9script
|
vim9script
|
||||||
|
@@ -754,6 +754,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 */
|
||||||
|
/**/
|
||||||
|
4499,
|
||||||
/**/
|
/**/
|
||||||
4498,
|
4498,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user