changeset 17284:d3b15a3789e1 v8.1.1641

patch 8.1.1641: garbage collection may run at a wrong moment commit https://github.com/vim/vim/commit/6cc7e21412487ff8bd531c73ac9325f5ba2409a9 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Jul 7 14:05:24 2019 +0200 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 https://github.com/vim/vim/issues/4620)
author Bram Moolenaar <Bram@vim.org>
date Sun, 07 Jul 2019 14:15:05 +0200
parents 6ea5e2c14ea4
children 413d523503a2
files src/misc2.c src/version.c
diffstat 2 files changed, 11 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -4444,12 +4444,19 @@ parse_queued_messages(void)
 {
     win_T   *old_curwin = curwin;
     int	    i;
+    int	    save_may_garbage_collect = may_garbage_collect;
 
     // Do not handle messages while redrawing, because it may cause buffers to
     // change or be wiped while they are being redrawn.
     if (updating_screen)
 	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.
     for (i = 0; i < MAX_REPEAT_PARSE; ++i)
     {
@@ -4485,6 +4492,8 @@ parse_queued_messages(void)
 	break;
     }
 
+    may_garbage_collect = save_may_garbage_collect;
+
     // 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.
     if (curwin != old_curwin)
--- a/src/version.c
+++ b/src/version.c
@@ -778,6 +778,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1641,
+/**/
     1640,
 /**/
     1639,