diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-09-08 20:40:34 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-09-08 20:40:34 +0200 |
commit | 072f1c68884a1e2d468a0f39e27fc28168fb4b03 (patch) | |
tree | ab3fc9cb142a15558aa6e06965e1c9b5bda9d9ca | |
parent | 36f691f5f1d0676f080cc97d697d742ed5cc8251 (diff) |
patch 8.2.3417: Vim9: a failing debug expression aborts script sourcingv8.2.3417
Problem: Vim9: a failing debug expression aborts script sourcing.
Solution: Do not let expression failure abort script sourcing. (closes #8848)
-rw-r--r-- | src/debugger.c | 34 | ||||
-rw-r--r-- | src/testdir/test_debugger.vim | 29 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 57 insertions, 8 deletions
diff --git a/src/debugger.c b/src/debugger.c index 1e28d66f61..fc0aa03653 100644 --- a/src/debugger.c +++ b/src/debugger.c @@ -531,6 +531,29 @@ static garray_T prof_ga = {0, 0, sizeof(struct debuggy), 4, NULL}; static linenr_T debuggy_find(int file,char_u *fname, linenr_T after, garray_T *gap, int *fp); /* + * Evaluate the "bp->dbg_name" expression and return the result. + * Restore the got_int and called_emsg flags. + */ + static typval_T * +eval_expr_restore(struct debuggy *bp) +{ + typval_T *tv; + int prev_called_emsg = called_emsg; + int prev_did_emsg = did_emsg; + + got_int = FALSE; + tv = eval_expr(bp->dbg_name, NULL); + + // Evaluating the expression should not result in breaking the sequence of + // commands. + got_int = FALSE; + called_emsg = prev_called_emsg; + did_emsg = prev_did_emsg; + + return tv; +} + +/* * Parse the arguments of ":profile", ":breakadd" or ":breakdel" and put them * in the entry just after the last one in dbg_breakp. Note that "dbg_name" * is allocated. @@ -614,7 +637,7 @@ dbg_parsearg( { bp->dbg_name = vim_strsave(p); if (bp->dbg_name != NULL) - bp->dbg_val = eval_expr(bp->dbg_name, NULL); + bp->dbg_val = eval_expr_restore(bp); } else { @@ -960,10 +983,7 @@ debuggy_find( typval_T *tv; int line = FALSE; - prev_got_int = got_int; - got_int = FALSE; - - tv = eval_expr(bp->dbg_name, NULL); + tv = eval_expr_restore(bp); if (tv != NULL) { if (bp->dbg_val == NULL) @@ -984,7 +1004,7 @@ debuggy_find( debug_oldval = typval_tostring(bp->dbg_val, TRUE); // Need to evaluate again, typval_compare() overwrites // "tv". - v = eval_expr(bp->dbg_name, NULL); + v = eval_expr_restore(bp); debug_newval = typval_tostring(v, TRUE); free_tv(bp->dbg_val); bp->dbg_val = v; @@ -1006,8 +1026,6 @@ debuggy_find( lnum = after > 0 ? after : 1; break; } - - got_int |= prev_got_int; } #endif } diff --git a/src/testdir/test_debugger.vim b/src/testdir/test_debugger.vim index 85ab6ea393..71fdedc5cf 100644 --- a/src/testdir/test_debugger.vim +++ b/src/testdir/test_debugger.vim @@ -318,7 +318,9 @@ func Test_Debugger() call RunDbgCmd(buf, 'enew! | only!') call StopVimInTerminal(buf) +endfunc +func Test_Debugger_breakadd() " Tests for :breakadd file and :breakadd here " Breakpoints should be set before sourcing the file @@ -342,10 +344,37 @@ func Test_Debugger() call delete('Xtest.vim') %bw! + call assert_fails('breakadd here', 'E32:') call assert_fails('breakadd file Xtest.vim /\)/', 'E55:') endfunc +def Test_Debugger_breakadd_expr() + var lines =<< trim END + vim9script + func g:EarlyFunc() + endfunc + breakadd expr DoesNotExist() + func g:LaterFunc() + endfunc + breakdel * + END + writefile(lines, 'Xtest.vim') + + # Start Vim in a terminal + var buf = RunVimInTerminal('-S Xtest.vim', {wait_for_ruler: 0}) + call TermWait(buf) + + # Despite the failure the functions are defined + RunDbgCmd(buf, ':function g:EarlyFunc', + ['function EarlyFunc()', 'endfunction'], {match: 'pattern'}) + RunDbgCmd(buf, ':function g:LaterFunc', + ['function LaterFunc()', 'endfunction'], {match: 'pattern'}) + + call StopVimInTerminal(buf) + call delete('Xtest.vim') +enddef + func Test_Backtrace_Through_Source() CheckCWD let file1 =<< trim END diff --git a/src/version.c b/src/version.c index c28a302a31..41b79a713b 100644 --- a/src/version.c +++ b/src/version.c @@ -756,6 +756,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3417, +/**/ 3416, /**/ 3415, |