Skip to content

Commit

Permalink
patch 8.1.1061: when substitute string throws error, substitute happe…
Browse files Browse the repository at this point in the history
…ns anyway

Problem:    When substitute string throws error, substitute happens anyway.
Solution:   Skip substitution when aborting. (closes #4161)
  • Loading branch information
brammool committed Mar 27, 2019
1 parent 760285d commit 0e97b94
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 1 deletion.
7 changes: 6 additions & 1 deletion src/ex_cmds.c
Expand Up @@ -5574,7 +5574,12 @@ do_sub(exarg_T *eap)
sub_firstlnum - regmatch.startpos[0].lnum,
sub, sub_firstline, FALSE, p_magic, TRUE);
#ifdef FEAT_EVAL
/* Don't keep flags set by a recursive call. */
// If getting the substitute string caused an error, don't do
// the replacement.
if (aborting())
goto skip;

// Don't keep flags set by a recursive call.
subflags = subflags_save;
if (subflags.do_count)
{
Expand Down
30 changes: 30 additions & 0 deletions src/testdir/test_substitute.vim
Expand Up @@ -610,3 +610,33 @@ func Test_sub_cmd_8()
enew!
set titlestring&
endfunc

func Test_nocatch_sub_failure_handling()
" normal error results in all replacements
func! Foo()
foobar
endfunc
new
call setline(1, ['1 aaa', '2 aaa', '3 aaa'])
%s/aaa/\=Foo()/g
call assert_equal(['1 0', '2 0', '3 0'], getline(1, 3))

" Trow without try-catch causes abort after the first line.
" We cannot test this, since it would stop executing the test script.

" try/catch does not result in any changes
func! Foo()
throw 'error'
endfunc
call setline(1, ['1 aaa', '2 aaa', '3 aaa'])
let error_caught = 0
try
%s/aaa/\=Foo()/g
catch
let error_caught = 1
endtry
call assert_equal(1, error_caught)
call assert_equal(['1 aaa', '2 aaa', '3 aaa'], getline(1, 3))

bwipe!
endfunc
2 changes: 2 additions & 0 deletions src/version.c
Expand Up @@ -775,6 +775,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1061,
/**/
1060,
/**/
Expand Down

0 comments on commit 0e97b94

Please sign in to comment.