diff src/vim9execute.c @ 21359:e3711ce8133b v8.2.1230

patch 8.2.1230: Vim9: list index error not caught by try/catch Commit: https://github.com/vim/vim/commit/68d130c618f363821761f231c4122a0b9b764b71 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Jul 17 22:06:44 2020 +0200 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 https://github.com/vim/vim/issues/6462)
author Bram Moolenaar <Bram@vim.org>
date Fri, 17 Jul 2020 22:15:04 +0200
parents d636c7bbe9ab
children fca850f4d603
line wrap: on
line diff
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -1065,6 +1065,8 @@ call_def_function(
 		    if (di == NULL)
 		    {
 			semsg(_(e_undefvar), name);
+			if (trylevel > 0)
+			    continue;
 			goto failed;
 		    }
 		    else
@@ -1786,6 +1788,7 @@ call_def_function(
 
 			--trystack->ga_len;
 			--trylevel;
+			ectx.ec_in_catch = FALSE;
 			trycmd = ((trycmd_T *)trystack->ga_data)
 							    + trystack->ga_len;
 			if (trycmd->tcd_caught && current_exception != NULL)
@@ -2084,7 +2087,10 @@ call_def_function(
 			    case EXPR_DIV:  f1 = f1 / f2; break;
 			    case EXPR_SUB:  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(tv2);
@@ -2138,6 +2144,8 @@ call_def_function(
 		    if (tv->v_type != VAR_LIST)
 		    {
 			emsg(_(e_listreq));
+			if (trylevel > 0)
+			    continue;
 			goto failed;
 		    }
 		    list = tv->vval.v_list;
@@ -2146,6 +2154,8 @@ call_def_function(
 		    if (tv->v_type != VAR_NUMBER)
 		    {
 			emsg(_(e_number_exp));
+			if (trylevel > 0)
+			    continue;
 			goto failed;
 		    }
 		    n = tv->vval.v_number;
@@ -2153,11 +2163,13 @@ call_def_function(
 		    if ((li = list_find(list, n)) == NULL)
 		    {
 			semsg(_(e_listidx), n);
+			if (trylevel > 0)
+			    continue;
 			goto failed;
 		    }
 		    --ectx.ec_stack.ga_len;
 		    // Clear the list after getting the item, to avoid that it
-		    // make the item invalid.
+		    // makes the item invalid.
 		    tv = STACK_TV_BOT(-1);
 		    temp_tv = *tv;
 		    copy_tv(&li->li_tv, tv);
@@ -2226,6 +2238,8 @@ call_def_function(
 		    if ((di = dict_find(dict, key, -1)) == NULL)
 		    {
 			semsg(_(e_dictkey), key);
+			if (trylevel > 0)
+			    continue;
 			goto failed;
 		    }
 		    clear_tv(tv);