changeset 12387:1ecdbc207c1e v8.0.1073

patch 8.0.1073: may get an endless loop if 'statusline' changes a highlight commit https://github.com/vim/vim/commit/ba2929b6afd2fc20479912a8dec789be26a38244 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Sep 8 13:59:21 2017 +0200 patch 8.0.1073: may get an endless loop if 'statusline' changes a highlight Problem: May get an endless loop if 'statusline' changes a highlight. Solution: Do not let evaluating 'statusline' trigger a redraw.
author Christian Brabandt <cb@256bit.org>
date Fri, 08 Sep 2017 14:00:05 +0200
parents 98665fe222b1
children 9741eade42c9
files src/buffer.c src/version.c
diffstat 2 files changed, 18 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -3915,8 +3915,8 @@ build_stl_str_hl(
     char_u	*t;
     int		byteval;
 #ifdef FEAT_EVAL
-    win_T	*o_curwin;
-    buf_T	*o_curbuf;
+    win_T	*save_curwin;
+    buf_T	*save_curbuf;
 #endif
     int		empty_line;
     colnr_T	virtcol;
@@ -3958,6 +3958,9 @@ build_stl_str_hl(
     char_u	tmp[TMPLEN];
     char_u	*usefmt = fmt;
     struct stl_hlrec *sp;
+    int		save_must_redraw = must_redraw;
+    int		save_redr_type = curwin->w_redr_type;
+    int		save_highlight_shcnaged = need_highlight_changed;
 
 #ifdef FEAT_EVAL
     /*
@@ -4267,15 +4270,15 @@ build_stl_str_hl(
 	    vim_snprintf((char *)tmp, sizeof(tmp), "%d", curbuf->b_fnum);
 	    set_internal_string_var((char_u *)"actual_curbuf", tmp);
 
-	    o_curbuf = curbuf;
-	    o_curwin = curwin;
+	    save_curbuf = curbuf;
+	    save_curwin = curwin;
 	    curwin = wp;
 	    curbuf = wp->w_buffer;
 
 	    str = eval_to_string_safe(p, &t, use_sandbox);
 
-	    curwin = o_curwin;
-	    curbuf = o_curbuf;
+	    curwin = save_curwin;
+	    curbuf = save_curbuf;
 	    do_unlet((char_u *)"g:actual_curbuf", TRUE);
 
 	    if (str != NULL && *str != 0)
@@ -4730,6 +4733,13 @@ build_stl_str_hl(
 	sp->userhl = 0;
     }
 
+    /* We do not want redrawing a stausline, ruler, title, etc. to trigger
+     * another redraw, it may cause an endless loop.  This happens when a
+     * statusline changes a highlight group. */
+    must_redraw = save_must_redraw;
+    curwin->w_redr_type = save_redr_type;
+    need_highlight_changed = save_highlight_shcnaged;
+
     return width;
 }
 #endif /* FEAT_STL_OPT */
--- a/src/version.c
+++ b/src/version.c
@@ -770,6 +770,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1073,
+/**/
     1072,
 /**/
     1071,