changeset 25767:dfa045d2cc89 v8.2.3419

patch 8.2.3419: a failing debug expression may make Vim unusable Commit: https://github.com/vim/vim/commit/0325d3967ce7d0fd35bc1472fd476b911b895b76 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Sep 9 12:34:19 2021 +0200 patch 8.2.3419: a failing debug expression may make Vim unusable Problem: A failing debug expression may make Vim unusable. Solution: Suppress error messages. (closes https://github.com/vim/vim/issues/8848)
author Bram Moolenaar <Bram@vim.org>
date Thu, 09 Sep 2021 12:45:03 +0200
parents c0b0335f8aa9
children 324dd1d24850
files src/debugger.c src/testdir/test_debugger.vim src/version.c
diffstat 3 files changed, 11 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/src/debugger.c
+++ b/src/debugger.c
@@ -532,23 +532,17 @@ static linenr_T debuggy_find(int file,ch
 
 /*
  * Evaluate the "bp->dbg_name" expression and return the result.
- * Restore the got_int and called_emsg flags.
+ * Disables error messages.
  */
     static typval_T *
-eval_expr_restore(struct debuggy *bp)
+eval_expr_no_emsg(struct debuggy *bp)
 {
     typval_T	*tv;
-    int		prev_called_emsg = called_emsg;
-    int		prev_did_emsg = did_emsg;
 
-    got_int = FALSE;
+    // Disable error messages, a bad expression would make Vim unusable.
+    ++emsg_off;
     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;
+    --emsg_off;
 
     return tv;
 }
@@ -637,7 +631,7 @@ dbg_parsearg(
     {
 	bp->dbg_name = vim_strsave(p);
 	if (bp->dbg_name != NULL)
-	    bp->dbg_val = eval_expr_restore(bp);
+	    bp->dbg_val = eval_expr_no_emsg(bp);
     }
     else
     {
@@ -983,7 +977,7 @@ debuggy_find(
 	    typval_T *tv;
 	    int	      line = FALSE;
 
-	    tv = eval_expr_restore(bp);
+	    tv = eval_expr_no_emsg(bp);
 	    if (tv != NULL)
 	    {
 		if (bp->dbg_val == NULL)
@@ -1004,7 +998,7 @@ debuggy_find(
 			debug_oldval = typval_tostring(bp->dbg_val, TRUE);
 			// Need to evaluate again, typval_compare() overwrites
 			// "tv".
-			v = eval_expr_restore(bp);
+			v = eval_expr_no_emsg(bp);
 			debug_newval = typval_tostring(v, TRUE);
 			free_tv(bp->dbg_val);
 			bp->dbg_val = v;
--- a/src/testdir/test_debugger.vim
+++ b/src/testdir/test_debugger.vim
@@ -271,9 +271,7 @@ func Test_Debugger()
   call RunDbgCmd(buf, 'breakd func a()', ['E475: Invalid argument: func a()'])
   call RunDbgCmd(buf, 'breakd func a', ['E161: Breakpoint not found: func a'])
   call RunDbgCmd(buf, 'breakd expr', ['E475: Invalid argument: expr'])
-  call RunDbgCmd(buf, 'breakd expr x', [
-	      \ 'E121: Undefined variable: x',
-	      \ 'E161: Breakpoint not found: expr x'])
+  call RunDbgCmd(buf, 'breakd expr x', ['E161: Breakpoint not found: expr x'])
 
   " finish the current function
   call RunDbgCmd(buf, 'finish', [
--- 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 */
 /**/
+    3419,
+/**/
     3418,
 /**/
     3417,