Mercurial > vim
changeset 14673:f1b7d308de2f v8.1.0349
patch 8.1.0349: crash when wiping buffer in a callback
commit https://github.com/vim/vim/commit/ed5a9d661248a2160368f1b0ab3a1bf74831db04
Author: Bram Moolenaar <Bram@vim.org>
Date: Thu Sep 6 13:14:43 2018 +0200
patch 8.1.0349: crash when wiping buffer in a callback
Problem: Crash when wiping buffer in a callback.
Solution: Do not handle messages when only peeking for a character.
(closes #2107) Add "redraw_flag" to test_override().
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Thu, 06 Sep 2018 13:15:05 +0200 |
parents | a4786c02f58f |
children | ab03bc29a3d3 |
files | runtime/doc/eval.txt src/evalfunc.c src/globals.h src/os_unix.c src/os_win32.c src/screen.c src/version.c |
diffstat | 7 files changed, 31 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -8737,6 +8737,7 @@ test_override({name}, {val}) *test_ov name effect when {val} is non-zero ~ redraw disable the redrawing() function + redraw_flag ignore the RedrawingDisabled flag char_avail disable the char_avail() function starting reset the "starting" variable, see below nfa_fail makes the NFA regexp engine fail to force a
--- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -13073,6 +13073,8 @@ f_test_override(typval_T *argvars, typva if (STRCMP(name, (char_u *)"redraw") == 0) disable_redraw_for_testing = val; + else if (STRCMP(name, (char_u *)"redraw_flag") == 0) + ignore_redraw_flag_for_testing = val; else if (STRCMP(name, (char_u *)"char_avail") == 0) disable_char_avail_for_testing = val; else if (STRCMP(name, (char_u *)"starting") == 0) @@ -13095,6 +13097,7 @@ f_test_override(typval_T *argvars, typva { disable_char_avail_for_testing = FALSE; disable_redraw_for_testing = FALSE; + ignore_redraw_flag_for_testing = FALSE; nfa_fail_for_testing = FALSE; if (save_starting >= 0) {
--- a/src/globals.h +++ b/src/globals.h @@ -1633,9 +1633,10 @@ EXTERN int alloc_fail_countdown INIT(= EXTERN int alloc_fail_repeat INIT(= 0); /* flags set by test_override() */ -EXTERN int disable_char_avail_for_testing INIT(= 0); -EXTERN int disable_redraw_for_testing INIT(= 0); -EXTERN int nfa_fail_for_testing INIT(= 0); +EXTERN int disable_char_avail_for_testing INIT(= FALSE); +EXTERN int disable_redraw_for_testing INIT(= FALSE); +EXTERN int ignore_redraw_flag_for_testing INIT(= FALSE); +EXTERN int nfa_fail_for_testing INIT(= FALSE); EXTERN int in_free_unref_items INIT(= FALSE); #endif
--- a/src/os_unix.c +++ b/src/os_unix.c @@ -417,10 +417,14 @@ mch_inchar( handle_resize(); #ifdef MESSAGE_QUEUE - parse_queued_messages(); - /* If input was put directly in typeahead buffer bail out here. */ - if (typebuf_changed(tb_change_cnt)) - return 0; + // Only process messages when waiting. + if (wtime != 0) + { + parse_queued_messages(); + // If input was put directly in typeahead buffer bail out here. + if (typebuf_changed(tb_change_cnt)) + return 0; + } #endif if (wtime < 0 && did_start_blocking) /* blocking and already waited for p_ut */
--- a/src/os_win32.c +++ b/src/os_win32.c @@ -1529,15 +1529,19 @@ WaitForChar(long msec, int ignore_input) */ for (;;) { + // Only process messages when waiting. + if (msec != 0) + { #ifdef MESSAGE_QUEUE - parse_queued_messages(); + parse_queued_messages(); #endif #ifdef FEAT_MZSCHEME - mzvim_check_threads(); + mzvim_check_threads(); #endif #ifdef FEAT_CLIENTSERVER - serverProcessPendingMessages(); -#endif + serverProcessPendingMessages(); +#endif + } if (0 #ifdef FEAT_MOUSE
--- a/src/screen.c +++ b/src/screen.c @@ -10819,8 +10819,11 @@ redrawing(void) return 0; else #endif - return (!RedrawingDisabled - && !(p_lz && char_avail() && !KeyTyped && !do_redraw)); + return ((!RedrawingDisabled +#ifdef FEAT_EVAL + || ignore_redraw_flag_for_testing +#endif + ) && !(p_lz && char_avail() && !KeyTyped && !do_redraw)); } /*