changeset 9481:7520696c14b0 v7.4.2021

commit https://github.com/vim/vim/commit/19ff9bf454b7492be64dd87aaf0830fa7961871e Author: Bram Moolenaar <Bram@vim.org> 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.
author Christian Brabandt <cb@256bit.org>
date Sun, 10 Jul 2016 19:15:06 +0200
parents 8d1406fbb955
children f36edffb8606
files src/buffer.c src/ex_cmds.c src/globals.h src/version.c
diffstat 4 files changed, 24 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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
 
--- 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
--- 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,