From: Bram Moolenaar Date: Sun, 7 Jul 2019 12:05:24 +0000 (+0200) Subject: patch 8.1.1641: garbage collection may run at a wrong moment X-Git-Tag: v8.1.1641 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6cc7e21412487ff8bd531c73ac9325f5ba2409a9;p=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) --- diff --git a/src/misc2.c b/src/misc2.c index 892fbc56a..000f043e1 100644 --- 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) diff --git a/src/version.c b/src/version.c index 85cf7b2e2..663f92f49 100644 --- a/src/version.c +++ b/src/version.c @@ -777,6 +777,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1641, /**/ 1640, /**/