Mercurial > vim
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)