# HG changeset patch # User Christian Brabandt # Date 1468170906 -7200 # Node ID 7520696c14b0e1ced6f0dbc25f5e4a6ba7ffd183 # Parent 8d1406fbb9554bd1600c8cd30831224a5f2244d9 commit https://github.com/vim/vim/commit/19ff9bf454b7492be64dd87aaf0830fa7961871e Author: Bram Moolenaar Date: Sun Jul 10 19:03:57 2016 +0200 patch 7.4.2021 Problem: Still too many buf_valid() calls. Solution: Make au_new_curbuf a bufref. Use bufref_valid() in more places. diff --git a/src/buffer.c b/src/buffer.c --- a/src/buffer.c +++ b/src/buffer.c @@ -1293,7 +1293,7 @@ do_buffer( * 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. + * 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,8 +1302,8 @@ do_buffer( 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; + if (au_new_curbuf.br_buf != NULL && bufref_valid(&au_new_curbuf)) + buf = au_new_curbuf.br_buf; # ifdef FEAT_JUMPLIST else # endif diff --git a/src/ex_cmds.c b/src/ex_cmds.c --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -3447,11 +3447,16 @@ do_wqall(exarg_T *eap) } 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 (!buf_valid(buf)) + if (!bufref_valid(&bufref)) buf = firstbuf; #endif } @@ -3659,6 +3664,7 @@ do_ecmd( 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,10 +3869,11 @@ do_ecmd( 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 (!buf_valid(buf) + if (!bufref_valid(&bufref) #ifdef FEAT_AUTOCMD || curbuf != old_curbuf #endif @@ -3908,10 +3915,11 @@ do_ecmd( */ if (buf->b_fname != NULL) new_name = vim_strsave(buf->b_fname); - au_new_curbuf = buf; + set_bufref(&au_new_curbuf, buf); apply_autocmds(EVENT_BUFLEAVE, NULL, NULL, FALSE, curbuf); - if (!buf_valid(buf)) /* new buffer has been deleted */ + if (!bufref_valid(&au_new_curbuf)) { + /* new buffer has been deleted */ delbuf_msg(new_name); /* frees new_name */ goto theend; } @@ -3951,8 +3959,9 @@ do_ecmd( } # endif /* Be careful again, like above. */ - if (!buf_valid(buf)) /* new buffer has been deleted */ + if (!bufref_valid(&au_new_curbuf)) { + /* new buffer has been deleted */ delbuf_msg(new_name); /* frees new_name */ goto theend; } @@ -3995,7 +4004,7 @@ do_ecmd( #ifdef FEAT_AUTOCMD } vim_free(new_name); - au_new_curbuf = NULL; + au_new_curbuf.br_buf = NULL; #endif } @@ -4071,6 +4080,7 @@ do_ecmd( 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,7 +4101,7 @@ do_ecmd( #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)) + if (!bufref_valid(&bufref)) { delbuf_msg(new_name); /* frees new_name */ goto theend; @@ -4375,7 +4385,7 @@ delbuf_msg(char_u *name) EMSG2(_("E143: Autocommands unexpectedly deleted new buffer %s"), name == NULL ? (char_u *)"" : name); vim_free(name); - au_new_curbuf = NULL; + au_new_curbuf.br_buf = NULL; } #endif diff --git a/src/globals.h b/src/globals.h --- a/src/globals.h +++ b/src/globals.h @@ -386,7 +386,7 @@ EXTERN int keep_filetype INIT(= FALSE); /* 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); +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 diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2021, +/**/ 2020, /**/ 2019,