mirror of
https://github.com/vim/vim.git
synced 2025-09-25 03:54:15 -04:00
patch 8.2.1230: Vim9: list index error not caught by try/catch
Problem: Vim9: list index error not caught by try/catch. Solution: Do not bail out if an error is inside try/catch. (closes #6462)
This commit is contained in:
@@ -509,6 +509,43 @@ def Test_try_catch()
|
|||||||
add(l, '3')
|
add(l, '3')
|
||||||
endtry # comment
|
endtry # comment
|
||||||
assert_equal(['1', 'wrong', '3'], l)
|
assert_equal(['1', 'wrong', '3'], l)
|
||||||
|
|
||||||
|
let n: number
|
||||||
|
try
|
||||||
|
n = l[3]
|
||||||
|
catch /E684:/
|
||||||
|
n = 99
|
||||||
|
endtry
|
||||||
|
assert_equal(99, n)
|
||||||
|
|
||||||
|
try
|
||||||
|
n = g:astring[3]
|
||||||
|
catch /E714:/
|
||||||
|
n = 77
|
||||||
|
endtry
|
||||||
|
assert_equal(77, n)
|
||||||
|
|
||||||
|
try
|
||||||
|
n = l[g:astring]
|
||||||
|
catch /E39:/
|
||||||
|
n = 77
|
||||||
|
endtry
|
||||||
|
assert_equal(77, n)
|
||||||
|
|
||||||
|
try
|
||||||
|
n = s:does_not_exist
|
||||||
|
catch /E121:/
|
||||||
|
n = 121
|
||||||
|
endtry
|
||||||
|
assert_equal(121, n)
|
||||||
|
|
||||||
|
let d = #{one: 1}
|
||||||
|
try
|
||||||
|
n = d[g:astring]
|
||||||
|
catch /E716:/
|
||||||
|
n = 222
|
||||||
|
endtry
|
||||||
|
assert_equal(222, n)
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
def ThrowFromDef()
|
def ThrowFromDef()
|
||||||
|
@@ -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 */
|
||||||
|
/**/
|
||||||
|
1230,
|
||||||
/**/
|
/**/
|
||||||
1229,
|
1229,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -1065,6 +1065,8 @@ call_def_function(
|
|||||||
if (di == NULL)
|
if (di == NULL)
|
||||||
{
|
{
|
||||||
semsg(_(e_undefvar), name);
|
semsg(_(e_undefvar), name);
|
||||||
|
if (trylevel > 0)
|
||||||
|
continue;
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1786,6 +1788,7 @@ call_def_function(
|
|||||||
|
|
||||||
--trystack->ga_len;
|
--trystack->ga_len;
|
||||||
--trylevel;
|
--trylevel;
|
||||||
|
ectx.ec_in_catch = FALSE;
|
||||||
trycmd = ((trycmd_T *)trystack->ga_data)
|
trycmd = ((trycmd_T *)trystack->ga_data)
|
||||||
+ trystack->ga_len;
|
+ trystack->ga_len;
|
||||||
if (trycmd->tcd_caught && current_exception != NULL)
|
if (trycmd->tcd_caught && current_exception != NULL)
|
||||||
@@ -2084,7 +2087,10 @@ call_def_function(
|
|||||||
case EXPR_DIV: f1 = f1 / f2; break;
|
case EXPR_DIV: f1 = f1 / f2; break;
|
||||||
case EXPR_SUB: f1 = f1 - f2; break;
|
case EXPR_SUB: f1 = f1 - f2; break;
|
||||||
case EXPR_ADD: f1 = f1 + f2; break;
|
case EXPR_ADD: f1 = f1 + f2; break;
|
||||||
default: emsg(_(e_modulus)); goto failed;
|
default: emsg(_(e_modulus));
|
||||||
|
if (trylevel > 0)
|
||||||
|
continue;
|
||||||
|
goto failed;
|
||||||
}
|
}
|
||||||
clear_tv(tv1);
|
clear_tv(tv1);
|
||||||
clear_tv(tv2);
|
clear_tv(tv2);
|
||||||
@@ -2138,6 +2144,8 @@ call_def_function(
|
|||||||
if (tv->v_type != VAR_LIST)
|
if (tv->v_type != VAR_LIST)
|
||||||
{
|
{
|
||||||
emsg(_(e_listreq));
|
emsg(_(e_listreq));
|
||||||
|
if (trylevel > 0)
|
||||||
|
continue;
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
list = tv->vval.v_list;
|
list = tv->vval.v_list;
|
||||||
@@ -2146,6 +2154,8 @@ call_def_function(
|
|||||||
if (tv->v_type != VAR_NUMBER)
|
if (tv->v_type != VAR_NUMBER)
|
||||||
{
|
{
|
||||||
emsg(_(e_number_exp));
|
emsg(_(e_number_exp));
|
||||||
|
if (trylevel > 0)
|
||||||
|
continue;
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
n = tv->vval.v_number;
|
n = tv->vval.v_number;
|
||||||
@@ -2153,11 +2163,13 @@ call_def_function(
|
|||||||
if ((li = list_find(list, n)) == NULL)
|
if ((li = list_find(list, n)) == NULL)
|
||||||
{
|
{
|
||||||
semsg(_(e_listidx), n);
|
semsg(_(e_listidx), n);
|
||||||
|
if (trylevel > 0)
|
||||||
|
continue;
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
--ectx.ec_stack.ga_len;
|
--ectx.ec_stack.ga_len;
|
||||||
// Clear the list after getting the item, to avoid that it
|
// Clear the list after getting the item, to avoid that it
|
||||||
// make the item invalid.
|
// makes the item invalid.
|
||||||
tv = STACK_TV_BOT(-1);
|
tv = STACK_TV_BOT(-1);
|
||||||
temp_tv = *tv;
|
temp_tv = *tv;
|
||||||
copy_tv(&li->li_tv, tv);
|
copy_tv(&li->li_tv, tv);
|
||||||
@@ -2226,6 +2238,8 @@ call_def_function(
|
|||||||
if ((di = dict_find(dict, key, -1)) == NULL)
|
if ((di = dict_find(dict, key, -1)) == NULL)
|
||||||
{
|
{
|
||||||
semsg(_(e_dictkey), key);
|
semsg(_(e_dictkey), key);
|
||||||
|
if (trylevel > 0)
|
||||||
|
continue;
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
clear_tv(tv);
|
clear_tv(tv);
|
||||||
|
Reference in New Issue
Block a user