0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 8.2.1233: Vim9: various errors not caught by try/catch

Problem:    Vim9: various errors not caught by try/catch.
Solution:   Do not bail out if an error is inside try/catch.
This commit is contained in:
Bram Moolenaar 2020-07-17 23:03:17 +02:00
parent b68ced5f07
commit f0b9f43c31
3 changed files with 71 additions and 24 deletions

View File

@ -17,6 +17,7 @@ let g:inc_counter = 1
let $SOME_ENV_VAR = 'some' let $SOME_ENV_VAR = 'some'
let g:alist = [7] let g:alist = [7]
let g:astring = 'text' let g:astring = 'text'
let g:anumber = 123
def Test_assignment() def Test_assignment()
let bool1: bool = true let bool1: bool = true
@ -534,6 +535,13 @@ def Test_try_catch()
try try
n = s:does_not_exist n = s:does_not_exist
catch /E121:/
n = 111
endtry
assert_equal(111, n)
try
n = g:does_not_exist
catch /E121:/ catch /E121:/
n = 121 n = 121
endtry endtry
@ -546,6 +554,50 @@ def Test_try_catch()
n = 222 n = 222
endtry endtry
assert_equal(222, n) assert_equal(222, n)
try
n = -g:astring
catch /E39:/
n = 233
endtry
assert_equal(233, n)
try
n = +g:astring
catch /E1030:/
n = 244
endtry
assert_equal(244, n)
try
n = +g:alist
catch /E745:/
n = 255
endtry
assert_equal(255, n)
let nd: dict<any>
try
nd = {g:anumber: 1}
catch /E1029:/
n = 266
endtry
assert_equal(266, n)
try
[n] = [1, 2, 3]
catch /E1093:/
n = 277
endtry
assert_equal(277, n)
# TODO: make this work
# try
# &ts = g:astring
# catch /E1093:/
# n = 288
# endtry
# assert_equal(288, 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 */
/**/
1233,
/**/ /**/
1232, 1232,
/**/ /**/

View File

@ -1065,9 +1065,7 @@ call_def_function(
if (di == NULL) if (di == NULL)
{ {
semsg(_(e_undefvar), name); semsg(_(e_undefvar), name);
if (trylevel > 0) goto on_error;
continue;
goto failed;
} }
else else
{ {
@ -1115,7 +1113,7 @@ call_def_function(
{ {
semsg(_("E121: Undefined variable: %c:%s"), semsg(_("E121: Undefined variable: %c:%s"),
namespace, iptr->isn_arg.string); namespace, iptr->isn_arg.string);
goto failed; goto on_error;
} }
else else
{ {
@ -2088,9 +2086,7 @@ call_def_function(
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)); default: emsg(_(e_modulus));
if (trylevel > 0) goto on_error;
continue;
goto failed;
} }
clear_tv(tv1); clear_tv(tv1);
clear_tv(tv2); clear_tv(tv2);
@ -2144,9 +2140,7 @@ call_def_function(
if (tv->v_type != VAR_LIST) if (tv->v_type != VAR_LIST)
{ {
emsg(_(e_listreq)); emsg(_(e_listreq));
if (trylevel > 0) goto on_error;
continue;
goto failed;
} }
list = tv->vval.v_list; list = tv->vval.v_list;
@ -2154,18 +2148,14 @@ 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) goto on_error;
continue;
goto failed;
} }
n = tv->vval.v_number; n = tv->vval.v_number;
clear_tv(tv); clear_tv(tv);
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) goto on_error;
continue;
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
@ -2238,9 +2228,7 @@ 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) goto on_error;
continue;
goto failed;
} }
clear_tv(tv); clear_tv(tv);
--ectx.ec_stack.ga_len; --ectx.ec_stack.ga_len;
@ -2291,7 +2279,7 @@ call_def_function(
) )
{ {
emsg(_(e_number_exp)); emsg(_(e_number_exp));
goto failed; goto on_error;
} }
#ifdef FEAT_FLOAT #ifdef FEAT_FLOAT
if (tv->v_type == VAR_FLOAT) if (tv->v_type == VAR_FLOAT)
@ -2307,10 +2295,10 @@ call_def_function(
tv = STACK_TV_BOT(-1); tv = STACK_TV_BOT(-1);
if (check_not_string(tv) == FAIL) if (check_not_string(tv) == FAIL)
goto failed; goto on_error;
(void)tv_get_number_chk(tv, &error); (void)tv_get_number_chk(tv, &error);
if (error) if (error)
goto failed; goto on_error;
} }
break; break;
@ -2329,7 +2317,7 @@ call_def_function(
semsg(_("E1029: Expected %s but got %s"), semsg(_("E1029: Expected %s but got %s"),
vartype_name(ct->ct_type), vartype_name(ct->ct_type),
vartype_name(tv->v_type)); vartype_name(tv->v_type));
goto failed; goto on_error;
} }
} }
break; break;
@ -2348,7 +2336,7 @@ call_def_function(
{ {
semsg(_("E1093: Expected %d items but got %d"), semsg(_("E1093: Expected %d items but got %d"),
min_len, list == NULL ? 0 : list->lv_len); min_len, list == NULL ? 0 : list->lv_len);
goto failed; goto on_error;
} }
} }
break; break;
@ -2403,6 +2391,11 @@ call_def_function(
clear_tv(STACK_TV_BOT(0)); clear_tv(STACK_TV_BOT(0));
break; break;
} }
continue;
on_error:
if (trylevel == 0)
goto failed;
} }
done: done: