0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 7.4.2021

Problem:    Still too many buf_valid() calls.
Solution:   Make au_new_curbuf a bufref.  Use bufref_valid() in more places.
This commit is contained in:
Bram Moolenaar
2016-07-10 19:03:57 +02:00
parent 453f37dbfd
commit 19ff9bf454
4 changed files with 24 additions and 12 deletions

View File

@@ -1293,7 +1293,7 @@ do_buffer(
* Deleting the current buffer: Need to find another buffer to go to. * Deleting the current buffer: Need to find another buffer to go to.
* There should be another, otherwise it would have been handled * There should be another, otherwise it would have been handled
* above. However, autocommands may have deleted all buffers. * 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. * Then prefer the buffer we most recently visited.
* Else try to find one that is loaded, after the current buffer, * Else try to find one that is loaded, after the current buffer,
* then before the current buffer. * then before the current buffer.
@@ -1302,8 +1302,8 @@ do_buffer(
buf = NULL; /* selected buffer */ buf = NULL; /* selected buffer */
bp = NULL; /* used when no loaded buffer found */ bp = NULL; /* used when no loaded buffer found */
#ifdef FEAT_AUTOCMD #ifdef FEAT_AUTOCMD
if (au_new_curbuf != NULL && buf_valid(au_new_curbuf)) if (au_new_curbuf.br_buf != NULL && bufref_valid(&au_new_curbuf))
buf = au_new_curbuf; buf = au_new_curbuf.br_buf;
# ifdef FEAT_JUMPLIST # ifdef FEAT_JUMPLIST
else else
# endif # endif

View File

@@ -3447,11 +3447,16 @@ do_wqall(exarg_T *eap)
} }
else else
{ {
#ifdef FEAT_AUTOCMD
bufref_T bufref;
set_bufref(&bufref, buf);
#endif
if (buf_write_all(buf, eap->forceit) == FAIL) if (buf_write_all(buf, eap->forceit) == FAIL)
++error; ++error;
#ifdef FEAT_AUTOCMD #ifdef FEAT_AUTOCMD
/* an autocommand may have deleted the buffer */ /* an autocommand may have deleted the buffer */
if (!buf_valid(buf)) if (!bufref_valid(&bufref))
buf = firstbuf; buf = firstbuf;
#endif #endif
} }
@@ -3659,6 +3664,7 @@ do_ecmd(
int did_set_swapcommand = FALSE; int did_set_swapcommand = FALSE;
#endif #endif
buf_T *buf; buf_T *buf;
bufref_T bufref;
#if defined(FEAT_AUTOCMD) || defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG) #if defined(FEAT_AUTOCMD) || defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
buf_T *old_curbuf = curbuf; buf_T *old_curbuf = curbuf;
#endif #endif
@@ -3863,10 +3869,11 @@ do_ecmd(
else /* existing memfile */ else /* existing memfile */
{ {
oldbuf = TRUE; oldbuf = TRUE;
set_bufref(&bufref, buf);
(void)buf_check_timestamp(buf, FALSE); (void)buf_check_timestamp(buf, FALSE);
/* Check if autocommands made buffer invalid or changed the current /* Check if autocommands made buffer invalid or changed the current
* buffer. */ * buffer. */
if (!buf_valid(buf) if (!bufref_valid(&bufref)
#ifdef FEAT_AUTOCMD #ifdef FEAT_AUTOCMD
|| curbuf != old_curbuf || curbuf != old_curbuf
#endif #endif
@@ -3908,10 +3915,11 @@ do_ecmd(
*/ */
if (buf->b_fname != NULL) if (buf->b_fname != NULL)
new_name = vim_strsave(buf->b_fname); 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); 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 */ delbuf_msg(new_name); /* frees new_name */
goto theend; goto theend;
} }
@@ -3951,8 +3959,9 @@ do_ecmd(
} }
# endif # endif
/* Be careful again, like above. */ /* 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 */ delbuf_msg(new_name); /* frees new_name */
goto theend; goto theend;
} }
@@ -3995,7 +4004,7 @@ do_ecmd(
#ifdef FEAT_AUTOCMD #ifdef FEAT_AUTOCMD
} }
vim_free(new_name); vim_free(new_name);
au_new_curbuf = NULL; au_new_curbuf.br_buf = NULL;
#endif #endif
} }
@@ -4071,6 +4080,7 @@ do_ecmd(
new_name = vim_strsave(buf->b_fname); new_name = vim_strsave(buf->b_fname);
else else
new_name = NULL; new_name = NULL;
set_bufref(&bufref, buf);
#endif #endif
if (p_ur < 0 || curbuf->b_ml.ml_line_count <= p_ur) if (p_ur < 0 || curbuf->b_ml.ml_line_count <= p_ur)
{ {
@@ -4091,7 +4101,7 @@ do_ecmd(
#ifdef FEAT_AUTOCMD #ifdef FEAT_AUTOCMD
/* If autocommands deleted the buffer we were going to re-edit, give /* If autocommands deleted the buffer we were going to re-edit, give
* up and jump to the end. */ * up and jump to the end. */
if (!buf_valid(buf)) if (!bufref_valid(&bufref))
{ {
delbuf_msg(new_name); /* frees new_name */ delbuf_msg(new_name); /* frees new_name */
goto theend; goto theend;
@@ -4375,7 +4385,7 @@ delbuf_msg(char_u *name)
EMSG2(_("E143: Autocommands unexpectedly deleted new buffer %s"), EMSG2(_("E143: Autocommands unexpectedly deleted new buffer %s"),
name == NULL ? (char_u *)"" : name); name == NULL ? (char_u *)"" : name);
vim_free(name); vim_free(name);
au_new_curbuf = NULL; au_new_curbuf.br_buf = NULL;
} }
#endif #endif

View File

@@ -386,7 +386,7 @@ EXTERN int keep_filetype INIT(= FALSE); /* value for did_filetype when
/* When deleting the current buffer, another one must be loaded. If we know /* When deleting the current buffer, another one must be loaded. If we know
* which one is preferred, au_new_curbuf is set to it */ * 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 /* When deleting a buffer/window and autocmd_busy is TRUE, do not free the
* buffer/window. but link it in the list starting with * buffer/window. but link it in the list starting with

View File

@@ -758,6 +758,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
2021,
/**/ /**/
2020, 2020,
/**/ /**/