To: vim_dev@googlegroups.com Subject: Patch 7.4.2021 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.4.2021 Problem: Still too many buf_valid() calls. Solution: Make au_new_curbuf a bufref. Use bufref_valid() in more places. Files: src/ex_cmds.c, src/buffer.c, src/globals.h *** ../vim-7.4.2020/src/ex_cmds.c 2016-07-09 23:40:29.831039214 +0200 --- src/ex_cmds.c 2016-07-10 18:56:04.366146885 +0200 *************** *** 3447,3457 **** } else { if (buf_write_all(buf, eap->forceit) == FAIL) ++error; #ifdef FEAT_AUTOCMD /* an autocommand may have deleted the buffer */ ! if (!buf_valid(buf)) buf = firstbuf; #endif } --- 3447,3462 ---- } else { + #ifdef FEAT_AUTOCMD + bufref_T bufref; + + set_bufref(&bufref, buf); + #endif if (buf_write_all(buf, eap->forceit) == FAIL) ++error; #ifdef FEAT_AUTOCMD /* an autocommand may have deleted the buffer */ ! if (!bufref_valid(&bufref)) buf = firstbuf; #endif } *************** *** 3659,3664 **** --- 3664,3670 ---- int did_set_swapcommand = FALSE; #endif buf_T *buf; + bufref_T bufref; #if defined(FEAT_AUTOCMD) || defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG) buf_T *old_curbuf = curbuf; #endif *************** *** 3863,3872 **** else /* existing memfile */ { oldbuf = TRUE; (void)buf_check_timestamp(buf, FALSE); /* Check if autocommands made buffer invalid or changed the current * buffer. */ ! if (!buf_valid(buf) #ifdef FEAT_AUTOCMD || curbuf != old_curbuf #endif --- 3869,3879 ---- else /* existing memfile */ { oldbuf = TRUE; + set_bufref(&bufref, buf); (void)buf_check_timestamp(buf, FALSE); /* Check if autocommands made buffer invalid or changed the current * buffer. */ ! if (!bufref_valid(&bufref) #ifdef FEAT_AUTOCMD || curbuf != old_curbuf #endif *************** *** 3908,3917 **** */ if (buf->b_fname != NULL) new_name = vim_strsave(buf->b_fname); ! au_new_curbuf = buf; apply_autocmds(EVENT_BUFLEAVE, NULL, NULL, FALSE, curbuf); ! if (!buf_valid(buf)) /* new buffer has been deleted */ { delbuf_msg(new_name); /* frees new_name */ goto theend; } --- 3915,3925 ---- */ if (buf->b_fname != NULL) new_name = vim_strsave(buf->b_fname); ! set_bufref(&au_new_curbuf, buf); apply_autocmds(EVENT_BUFLEAVE, NULL, NULL, FALSE, curbuf); ! if (!bufref_valid(&au_new_curbuf)) { + /* new buffer has been deleted */ delbuf_msg(new_name); /* frees new_name */ goto theend; } *************** *** 3951,3958 **** } # endif /* Be careful again, like above. */ ! if (!buf_valid(buf)) /* new buffer has been deleted */ { delbuf_msg(new_name); /* frees new_name */ goto theend; } --- 3959,3967 ---- } # endif /* Be careful again, like above. */ ! if (!bufref_valid(&au_new_curbuf)) { + /* new buffer has been deleted */ delbuf_msg(new_name); /* frees new_name */ goto theend; } *************** *** 3995,4001 **** #ifdef FEAT_AUTOCMD } vim_free(new_name); ! au_new_curbuf = NULL; #endif } --- 4004,4010 ---- #ifdef FEAT_AUTOCMD } vim_free(new_name); ! au_new_curbuf.br_buf = NULL; #endif } *************** *** 4071,4076 **** --- 4080,4086 ---- new_name = vim_strsave(buf->b_fname); else new_name = NULL; + set_bufref(&bufref, buf); #endif if (p_ur < 0 || curbuf->b_ml.ml_line_count <= p_ur) { *************** *** 4091,4097 **** #ifdef FEAT_AUTOCMD /* If autocommands deleted the buffer we were going to re-edit, give * up and jump to the end. */ ! if (!buf_valid(buf)) { delbuf_msg(new_name); /* frees new_name */ goto theend; --- 4101,4107 ---- #ifdef FEAT_AUTOCMD /* If autocommands deleted the buffer we were going to re-edit, give * up and jump to the end. */ ! if (!bufref_valid(&bufref)) { delbuf_msg(new_name); /* frees new_name */ goto theend; *************** *** 4375,4381 **** EMSG2(_("E143: Autocommands unexpectedly deleted new buffer %s"), name == NULL ? (char_u *)"" : name); vim_free(name); ! au_new_curbuf = NULL; } #endif --- 4385,4391 ---- EMSG2(_("E143: Autocommands unexpectedly deleted new buffer %s"), name == NULL ? (char_u *)"" : name); vim_free(name); ! au_new_curbuf.br_buf = NULL; } #endif *** ../vim-7.4.2020/src/buffer.c 2016-07-10 18:33:55.822012755 +0200 --- src/buffer.c 2016-07-10 18:47:53.325503203 +0200 *************** *** 1293,1299 **** * Deleting the current buffer: Need to find another buffer to go to. * There should be another, otherwise it would have been handled * above. However, autocommands may have deleted all buffers. ! * First use au_new_curbuf, if it is valid. * Then prefer the buffer we most recently visited. * Else try to find one that is loaded, after the current buffer, * then before the current buffer. --- 1293,1299 ---- * Deleting the current buffer: Need to find another buffer to go to. * There should be another, otherwise it would have been handled * above. However, autocommands may have deleted all buffers. ! * First use au_new_curbuf.br_buf, if it is valid. * Then prefer the buffer we most recently visited. * Else try to find one that is loaded, after the current buffer, * then before the current buffer. *************** *** 1302,1309 **** buf = NULL; /* selected buffer */ bp = NULL; /* used when no loaded buffer found */ #ifdef FEAT_AUTOCMD ! if (au_new_curbuf != NULL && buf_valid(au_new_curbuf)) ! buf = au_new_curbuf; # ifdef FEAT_JUMPLIST else # endif --- 1302,1309 ---- buf = NULL; /* selected buffer */ bp = NULL; /* used when no loaded buffer found */ #ifdef FEAT_AUTOCMD ! if (au_new_curbuf.br_buf != NULL && bufref_valid(&au_new_curbuf)) ! buf = au_new_curbuf.br_buf; # ifdef FEAT_JUMPLIST else # endif *** ../vim-7.4.2020/src/globals.h 2016-07-09 23:40:29.839039098 +0200 --- src/globals.h 2016-07-10 18:54:40.711399545 +0200 *************** *** 386,392 **** /* When deleting the current buffer, another one must be loaded. If we know * which one is preferred, au_new_curbuf is set to it */ ! EXTERN buf_T *au_new_curbuf INIT(= NULL); /* When deleting a buffer/window and autocmd_busy is TRUE, do not free the * buffer/window. but link it in the list starting with --- 386,392 ---- /* When deleting the current buffer, another one must be loaded. If we know * which one is preferred, au_new_curbuf is set to it */ ! EXTERN bufref_T au_new_curbuf INIT(= {NULL}); /* When deleting a buffer/window and autocmd_busy is TRUE, do not free the * buffer/window. but link it in the list starting with *** ../vim-7.4.2020/src/version.c 2016-07-10 18:33:55.826012695 +0200 --- src/version.c 2016-07-10 19:02:08.236700637 +0200 *************** *** 760,761 **** --- 760,763 ---- { /* Add new patch number below this line */ + /**/ + 2021, /**/ -- Two fish in a tank. One says to the other: "Do you know how to drive this thing?" /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///