1
0
forked from aniani/vim

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