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:
@@ -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
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user