diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-02-20 20:41:06 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-02-20 20:41:06 +0100 |
commit | f575adff06d4bc5f670939567ce86974683deb7a (patch) | |
tree | 30cb1d2318d5de6dc8bf04131d64537d82436a17 /src | |
parent | 11ec807639ae642bf55da883918489e2cd9911ab (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.
Diffstat (limited to 'src')
-rw-r--r-- | src/testdir/test_vim9_script.vim | 28 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9execute.c | 3 |
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) |