summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-02-20 20:41:06 +0100
committerBram Moolenaar <Bram@vim.org>2020-02-20 20:41:06 +0100
commitf575adff06d4bc5f670939567ce86974683deb7a (patch)
tree30cb1d2318d5de6dc8bf04131d64537d82436a17
parent11ec807639ae642bf55da883918489e2cd9911ab (diff)
patch 8.2.0287: Vim9: return in try block not tested; catch not testedv8.2.0287
Problem: Vim9: return in try block not tested; catch with pattern not tested. Solution: Add tests. Make it work.
-rw-r--r--src/testdir/test_vim9_script.vim28
-rw-r--r--src/version.c2
-rw-r--r--src/vim9execute.c3
3 files changed, 32 insertions, 1 deletions
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim
index ac721a80c6..3212c3de20 100644
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -236,12 +236,40 @@ def CatchInDef()
endtry
enddef
+def ReturnFinally(): string
+ try
+ return 'intry'
+ finally
+ g:in_finally = 'finally'
+ endtry
+ return 'end'
+enddef
+
def Test_try_catch_nested()
CatchInFunc()
assert_equal('getout', g:thrown_func)
CatchInDef()
assert_equal('getout', g:thrown_def)
+
+ assert_equal('intry', ReturnFinally())
+ assert_equal('finally', g:in_finally)
+enddef
+
+def Test_try_catch_match()
+ let seq = 'a'
+ try
+ throw 'something'
+ catch /nothing/
+ seq ..= 'x'
+ catch /some/
+ seq ..= 'b'
+ catch /asdf/
+ seq ..= 'x'
+ finally
+ seq ..= 'c'
+ endtry
+ assert_equal('abc', seq)
enddef
let s:export_script_lines =<< trim END
diff --git a/src/version.c b/src/version.c
index e17c98b232..4be1aa357b 100644
--- a/src/version.c
+++ b/src/version.c
@@ -739,6 +739,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 287,
+/**/
286,
/**/
285,
diff --git a/src/vim9execute.c b/src/vim9execute.c
index 6fad391d1f..7be8cdb926 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -1065,6 +1065,7 @@ call_def_function(
trycmd->tcd_frame = ectx.ec_frame;
trycmd->tcd_catch_idx = iptr->isn_arg.try.try_catch;
trycmd->tcd_finally_idx = iptr->isn_arg.try.try_finally;
+ trycmd->tcd_caught = FALSE;
}
break;
@@ -1109,7 +1110,7 @@ call_def_function(
--trylevel;
trycmd = ((trycmd_T *)trystack->ga_data)
+ trystack->ga_len;
- if (trycmd->tcd_caught)
+ if (trycmd->tcd_caught && current_exception != NULL)
{
// discard the exception
if (caught_stack == current_exception)