summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-07-18 18:13:02 +0200
committerBram Moolenaar <Bram@vim.org>2020-07-18 18:13:02 +0200
commitd032f34a51c6722101626c4167dffecc427ac343 (patch)
treeff0a74f0ae79f20fa6be4affad9fda253063a2f1 /src
parent447bfba24b231777a79bf53cdb33f44d9691e47e (diff)
patch 8.2.1238: Vim9: a few remaining errors not caught by try/catchv8.2.1238
Problem: Vim9: a few remaining errors not caught by try/catch. Solution: Do not bail out if an error is inside try/catch.
Diffstat (limited to 'src')
-rw-r--r--src/testdir/test_vim9_script.vim57
-rw-r--r--src/version.c2
-rw-r--r--src/vim9execute.c59
3 files changed, 82 insertions, 36 deletions
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim
index a646de9785..035c731cc4 100644
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -498,6 +498,10 @@ def Test_cmd_modifier()
call CheckDefFailure(['5tab echo 3'], 'E16:')
enddef
+func g:NoSuchFunc()
+ echo 'none'
+endfunc
+
def Test_try_catch()
let l = []
try # comment
@@ -656,6 +660,57 @@ def Test_try_catch()
n = 344
endtry
assert_equal(344, n)
+
+ try
+ echo len(v:true)
+ catch /E701:/
+ n = 355
+ endtry
+ assert_equal(355, n)
+
+ let P = function('g:NoSuchFunc')
+ delfunc g:NoSuchFunc
+ try
+ echo P()
+ catch /E117:/
+ n = 366
+ endtry
+ assert_equal(366, n)
+
+ try
+ echo g:NoSuchFunc()
+ catch /E117:/
+ n = 377
+ endtry
+ assert_equal(377, n)
+
+ try
+ echo g:alist + 4
+ catch /E745:/
+ n = 388
+ endtry
+ assert_equal(388, n)
+
+ try
+ echo 4 + g:alist
+ catch /E745:/
+ n = 399
+ endtry
+ assert_equal(399, n)
+
+ try
+ echo g:alist.member
+ catch /E715:/
+ n = 400
+ endtry
+ assert_equal(400, n)
+
+ try
+ echo d.member
+ catch /E716:/
+ n = 411
+ endtry
+ assert_equal(411, n)
enddef
def DeletedFunc(): list<any>
@@ -2029,7 +2084,7 @@ def Test_vim9_comment()
CheckScriptFailure([
'vim9script',
'syntax region Word start=/pat/ end=/pat/# comment',
- ], 'E475:')
+ ], 'E402:')
CheckScriptSuccess([
'vim9script',
diff --git a/src/version.c b/src/version.c
index 06f7fd2b85..77576d9a93 100644
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1238,
+/**/
1237,
/**/
1236,
diff --git a/src/vim9execute.c b/src/vim9execute.c
index ce12781670..9f037a3be1 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -1512,6 +1512,7 @@ call_def_function(
item->di_tv.v_lock = 0;
if (dict_add(dict, item) == FAIL)
{
+ // can this ever happen?
dict_unref(dict);
goto failed;
}
@@ -1544,7 +1545,7 @@ call_def_function(
if (call_bfunc(iptr->isn_arg.bfunc.cbf_idx,
iptr->isn_arg.bfunc.cbf_argcount,
&ectx) == FAIL)
- goto failed;
+ goto on_error;
break;
// call a funcref or partial
@@ -1571,7 +1572,7 @@ call_def_function(
if (tv == &partial_tv)
clear_tv(&partial_tv);
if (r == FAIL)
- goto failed;
+ goto on_error;
}
break;
@@ -1592,7 +1593,7 @@ call_def_function(
SOURCING_LNUM = iptr->isn_lnum;
if (call_eval_func(cufunc->cuf_name,
cufunc->cuf_argcount, &ectx, iptr) == FAIL)
- goto failed;
+ goto on_error;
}
break;
@@ -1614,19 +1615,7 @@ call_def_function(
trycmd->tcd_return = TRUE;
}
else
- {
- // Restore previous function. If the frame pointer
- // is zero then there is none and we are done.
- if (ectx.ec_frame_idx == initial_frame_idx)
- {
- if (handle_closure_in_use(&ectx, FALSE) == FAIL)
- goto failed;
- goto done;
- }
-
- if (func_return(&ectx) == FAIL)
- goto failed;
- }
+ goto func_return;
}
break;
@@ -1735,8 +1724,6 @@ call_def_function(
{
listitem_T *li = list_find(list, idxtv->vval.v_number);
- if (li == NULL)
- goto failed;
copy_tv(&li->li_tv, STACK_TV_BOT(0));
++ectx.ec_stack.ga_len;
}
@@ -1814,19 +1801,7 @@ call_def_function(
}
if (trycmd->tcd_return)
- {
- // Restore previous function. If the frame pointer
- // is zero then there is none and we are done.
- if (ectx.ec_frame_idx == initial_frame_idx)
- {
- if (handle_closure_in_use(&ectx, FALSE) == FAIL)
- goto failed;
- goto done;
- }
-
- if (func_return(&ectx) == FAIL)
- goto failed;
- }
+ goto func_return;
}
}
break;
@@ -2068,7 +2043,7 @@ call_def_function(
{
n1 = tv_get_number_chk(tv1, &error);
if (error)
- goto failed;
+ goto on_error;
#ifdef FEAT_FLOAT
if (tv2->v_type == VAR_FLOAT)
f1 = n1;
@@ -2085,7 +2060,7 @@ call_def_function(
{
n2 = tv_get_number_chk(tv2, &error);
if (error)
- goto failed;
+ goto on_error;
#ifdef FEAT_FLOAT
if (tv1->v_type == VAR_FLOAT)
f2 = n2;
@@ -2268,7 +2243,7 @@ call_def_function(
if (tv->v_type != VAR_DICT || tv->vval.v_dict == NULL)
{
emsg(_(e_dictreq));
- goto failed;
+ goto on_error;
}
dict = tv->vval.v_dict;
@@ -2276,7 +2251,7 @@ call_def_function(
== NULL)
{
semsg(_(e_dictkey), iptr->isn_arg.string);
- goto failed;
+ goto on_error;
}
// Clear the dict after getting the item, to avoid that it
// make the item invalid.
@@ -2409,6 +2384,20 @@ call_def_function(
}
continue;
+func_return:
+ // Restore previous function. If the frame pointer is zero then there
+ // is none and we are done.
+ if (ectx.ec_frame_idx == initial_frame_idx)
+ {
+ if (handle_closure_in_use(&ectx, FALSE) == FAIL)
+ // only fails when out of memory
+ goto failed;
+ goto done;
+ }
+ if (func_return(&ectx) == FAIL)
+ // only fails when out of memory
+ goto failed;
+
on_error:
if (trylevel == 0)
goto failed;