0
0
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:
Bram Moolenaar
2020-07-17 22:06:44 +02:00
parent 6e36b1c18e
commit 68d130c618
3 changed files with 55 additions and 2 deletions

View File

@@ -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()

View File

@@ -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,
/**/ /**/

View File

@@ -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);