0
0
mirror of https://github.com/vim/vim.git synced 2025-08-31 20:53:42 -04:00

patch 8.1.1419: listener callbacks may be called recursively

Problem:    Listener callbacks may be called recursively.
Solution:   Set "updating_screen" while listener callbacks are invoked.
This commit is contained in:
Bram Moolenaar 2019-05-29 22:28:29 +02:00
parent 868b7b6712
commit 68a4b04a8d
5 changed files with 27 additions and 7 deletions

View File

@ -376,10 +376,18 @@ invoke_listeners(buf_T *buf)
linenr_T start = MAXLNUM;
linenr_T end = 0;
linenr_T added = 0;
int save_updating_screen = updating_screen;
static int recursive = FALSE;
if (buf->b_recorded_changes == NULL // nothing changed
|| buf->b_listener == NULL) // no listeners
|| buf->b_listener == NULL // no listeners
|| recursive) // already busy
return;
recursive = TRUE;
// Block messages on channels from being handled, so that they don't make
// text changes here.
++updating_screen;
argv[0].v_type = VAR_NUMBER;
argv[0].vval.v_number = buf->b_fnum; // a:bufnr
@ -418,6 +426,12 @@ invoke_listeners(buf_T *buf)
--textlock;
list_unref(buf->b_recorded_changes);
buf->b_recorded_changes = NULL;
if (save_updating_screen)
updating_screen = TRUE;
else
after_updating_screen(TRUE);
recursive = FALSE;
}
#endif

View File

@ -10,7 +10,7 @@ void redraw_buf_and_status_later(buf_T *buf, int type);
int redraw_asap(int type);
void redraw_after_callback(int call_update_screen);
void redrawWinline(win_T *wp, linenr_T lnum);
void reset_updating_screen(int may_resize_shell);
void after_updating_screen(int may_resize_shell);
void update_curbuf(int type);
int update_screen(int type_arg);
int conceal_cursor_line(win_T *wp);
@ -18,7 +18,7 @@ void conceal_check_cursor_line(void);
void update_debug_sign(buf_T *buf, linenr_T lnum);
void updateWindow(win_T *wp);
int screen_get_current_line_off(void);
void screen_line(int row, int coloff, int endcol, int clear_width, int rlflag);
void screen_line(int row, int coloff, int endcol, int clear_width, int flags);
void rl_mirror(char_u *str);
void status_redraw_all(void);
void status_redraw_curbuf(void);

View File

@ -506,8 +506,12 @@ redrawWinline(
redraw_win_later(wp, VALID);
}
/*
* To be called when "updating_screen" was set before and now the postponed
* side effects may take place.
*/
void
reset_updating_screen(int may_resize_shell UNUSED)
after_updating_screen(int may_resize_shell UNUSED)
{
updating_screen = FALSE;
#ifdef FEAT_GUI
@ -803,7 +807,7 @@ update_screen(int type_arg)
FOR_ALL_WINDOWS(wp)
wp->w_buffer->b_mod_set = FALSE;
reset_updating_screen(TRUE);
after_updating_screen(TRUE);
/* Clear or redraw the command line. Done last, because scrolling may
* mess up the command line. */
@ -886,7 +890,7 @@ update_finish(void)
end_search_hl();
# endif
reset_updating_screen(TRUE);
after_updating_screen(TRUE);
# ifdef FEAT_GUI
/* Redraw the cursor and update the scrollbars when all screen updating is

View File

@ -691,7 +691,7 @@ ui_breakcheck_force(int force)
if (save_updating_screen)
updating_screen = TRUE;
else
reset_updating_screen(FALSE);
after_updating_screen(FALSE);
recursive = FALSE;
}

View File

@ -767,6 +767,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1419,
/**/
1418,
/**/