vim-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.
ba2929b6af
This commit is contained in:
Jan Edmund Lazo
2019-02-02 07:44:20 -05:00
parent 29db365e4c
commit c1ef241390

View File

@@ -3224,6 +3224,9 @@ int build_stl_str_hl(
#define TMPLEN 70
char_u tmp[TMPLEN];
char_u *usefmt = fmt;
const int save_must_redraw = must_redraw;
const int save_redr_type = curwin->w_redr_type;
const int save_highlight_shcnaged = need_highlight_changed;
// When the format starts with "%!" then evaluate it as an expression and
// use the result as the actual format string.
@@ -3632,16 +3635,16 @@ int build_stl_str_hl(
vim_snprintf((char *)tmp, sizeof(tmp), "%d", curbuf->b_fnum);
set_internal_string_var((char_u *)"g:actual_curbuf", tmp);
buf_T *o_curbuf = curbuf;
win_T *o_curwin = curwin;
buf_T *const save_curbuf = curbuf;
win_T *const save_curwin = curwin;
curwin = wp;
curbuf = wp->w_buffer;
// Note: The result stored in `t` is unused.
str = eval_to_string_safe(out_p, &t, use_sandbox);
curwin = o_curwin;
curbuf = o_curbuf;
curwin = save_curwin;
curbuf = save_curbuf;
// Remove the variable we just stored
do_unlet(S_LEN("g:actual_curbuf"), true);
@@ -4262,6 +4265,13 @@ int build_stl_str_hl(
cur_tab_rec->def.func = NULL;
}
// 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;
}