To: vim_dev@googlegroups.com Subject: Patch 8.2.3417 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.3417 Problem: Vim9: a failing debug expression aborts script sourcing. Solution: Do not let expression failure abort script sourcing. (closes #8848) Files: src/debugger.c, src/testdir/test_debugger.vim *** ../vim-8.2.3416/src/debugger.c 2021-09-02 18:49:02.748932320 +0200 --- src/debugger.c 2021-09-08 19:52:38.351870555 +0200 *************** *** 531,536 **** --- 531,559 ---- 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,620 **** { bp->dbg_name = vim_strsave(p); if (bp->dbg_name != NULL) ! bp->dbg_val = eval_expr(bp->dbg_name, NULL); } else { --- 637,643 ---- { bp->dbg_name = vim_strsave(p); if (bp->dbg_name != NULL) ! bp->dbg_val = eval_expr_restore(bp); } else { *************** *** 960,969 **** typval_T *tv; int line = FALSE; ! prev_got_int = got_int; ! got_int = FALSE; ! ! tv = eval_expr(bp->dbg_name, NULL); if (tv != NULL) { if (bp->dbg_val == NULL) --- 983,989 ---- typval_T *tv; int line = FALSE; ! tv = eval_expr_restore(bp); if (tv != NULL) { if (bp->dbg_val == NULL) *************** *** 984,990 **** debug_oldval = typval_tostring(bp->dbg_val, TRUE); // Need to evaluate again, typval_compare() overwrites // "tv". ! v = eval_expr(bp->dbg_name, NULL); debug_newval = typval_tostring(v, TRUE); free_tv(bp->dbg_val); bp->dbg_val = v; --- 1004,1010 ---- debug_oldval = typval_tostring(bp->dbg_val, TRUE); // Need to evaluate again, typval_compare() overwrites // "tv". ! v = eval_expr_restore(bp); debug_newval = typval_tostring(v, TRUE); free_tv(bp->dbg_val); bp->dbg_val = v; *************** *** 1006,1013 **** lnum = after > 0 ? after : 1; break; } - - got_int |= prev_got_int; } #endif } --- 1026,1031 ---- *** ../vim-8.2.3416/src/testdir/test_debugger.vim 2021-09-02 18:49:02.748932320 +0200 --- src/testdir/test_debugger.vim 2021-09-08 20:39:44.133209624 +0200 *************** *** 318,324 **** --- 318,326 ---- 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,351 **** --- 344,380 ---- 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 *** ../vim-8.2.3416/src/version.c 2021-09-08 15:33:25.160576403 +0200 --- src/version.c 2021-09-08 19:38:33.189736161 +0200 *************** *** 757,758 **** --- 757,760 ---- { /* Add new patch number below this line */ + /**/ + 3417, /**/ -- The Feynman problem solving Algorithm: 1) Write down the problem 2) Think real hard 3) Write down the answer /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///