forked from aniani/vim
patch 8.1.1641: garbage collection may run at a wrong moment
Problem: Garbage collection may run at a wrong moment. (Trygve Aaberge) Solution: Postpone garbage collection while parsing messages. (closes #4620)
This commit is contained in:
@@ -4444,12 +4444,19 @@ parse_queued_messages(void)
|
|||||||
{
|
{
|
||||||
win_T *old_curwin = curwin;
|
win_T *old_curwin = curwin;
|
||||||
int i;
|
int i;
|
||||||
|
int save_may_garbage_collect = may_garbage_collect;
|
||||||
|
|
||||||
// Do not handle messages while redrawing, because it may cause buffers to
|
// Do not handle messages while redrawing, because it may cause buffers to
|
||||||
// change or be wiped while they are being redrawn.
|
// change or be wiped while they are being redrawn.
|
||||||
if (updating_screen)
|
if (updating_screen)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// may_garbage_collect is set in main_loop() to do garbage collection when
|
||||||
|
// blocking to wait on a character. We don't want that while parsing
|
||||||
|
// messages, a callback may invoke vgetc() while lists and dicts are in use
|
||||||
|
// in the call stack.
|
||||||
|
may_garbage_collect = FALSE;
|
||||||
|
|
||||||
// Loop when a job ended, but don't keep looping forever.
|
// Loop when a job ended, but don't keep looping forever.
|
||||||
for (i = 0; i < MAX_REPEAT_PARSE; ++i)
|
for (i = 0; i < MAX_REPEAT_PARSE; ++i)
|
||||||
{
|
{
|
||||||
@@ -4485,6 +4492,8 @@ parse_queued_messages(void)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
may_garbage_collect = save_may_garbage_collect;
|
||||||
|
|
||||||
// If the current window changed we need to bail out of the waiting loop.
|
// If the current window changed we need to bail out of the waiting loop.
|
||||||
// E.g. when a job exit callback closes the terminal window.
|
// E.g. when a job exit callback closes the terminal window.
|
||||||
if (curwin != old_curwin)
|
if (curwin != old_curwin)
|
||||||
|
@@ -777,6 +777,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1641,
|
||||||
/**/
|
/**/
|
||||||
1640,
|
1640,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user