summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2016-07-10 22:11:16 +0200
committerBram Moolenaar <Bram@vim.org>2016-07-10 22:11:16 +0200
commit7c0a2f367f2507669560b1a66423155c70d2e75b (patch)
tree7cd0523311a25f653497197abc1fa86ed62bcc79 /src
parentea3f2e7be447a8f0c4436869620f908de5e8ef1e (diff)
patch 7.4.2024v7.4.2024
Problem: More buf_valid() calls can be optimized. Solution: Use bufref_valid() instead.
Diffstat (limited to 'src')
-rw-r--r--src/buffer.c28
-rw-r--r--src/channel.c62
-rw-r--r--src/diff.c10
-rw-r--r--src/eval.c5
-rw-r--r--src/ex_cmds.c13
-rw-r--r--src/ex_cmds2.c41
-rw-r--r--src/ex_docmd.c5
-rw-r--r--src/ex_getln.c17
-rw-r--r--src/fileio.c44
-rw-r--r--src/if_py_both.h49
-rw-r--r--src/main.c6
-rw-r--r--src/misc2.c5
-rw-r--r--src/netbeans.c7
-rw-r--r--src/proto/buffer.pro2
-rw-r--r--src/proto/window.pro4
-rw-r--r--src/quickfix.c13
-rw-r--r--src/spell.c9
-rw-r--r--src/structs.h4
-rw-r--r--src/term.c8
-rw-r--r--src/version.c2
-rw-r--r--src/window.c17
21 files changed, 218 insertions, 133 deletions
diff --git a/src/buffer.c b/src/buffer.c
index 903a94aebf..9511d61597 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -83,7 +83,7 @@ open_buffer(
{
int retval = OK;
#ifdef FEAT_AUTOCMD
- buf_T *old_curbuf;
+ bufref_T old_curbuf;
#endif
#ifdef FEAT_SYN_HL
long old_tw = curbuf->b_p_tw;
@@ -129,7 +129,7 @@ open_buffer(
#ifdef FEAT_AUTOCMD
/* The autocommands in readfile() may change the buffer, but only AFTER
* reading the file. */
- old_curbuf = curbuf;
+ set_bufref(&old_curbuf, curbuf);
modified_was_set = FALSE;
#endif
@@ -284,12 +284,12 @@ open_buffer(
* The autocommands may have changed the current buffer. Apply the
* modelines to the correct buffer, if it still exists and is loaded.
*/
- if (buf_valid(old_curbuf) && old_curbuf->b_ml.ml_mfp != NULL)
+ if (bufref_valid(&old_curbuf) && old_curbuf.br_buf->b_ml.ml_mfp != NULL)
{
aco_save_T aco;
/* Go to the buffer that was opened. */
- aucmd_prepbuf(&aco, old_curbuf);
+ aucmd_prepbuf(&aco, old_curbuf.br_buf);
#endif
do_modelines(0);
curbuf->b_flags &= ~(BF_CHECK_RO | BF_NEVERLOADED);
@@ -809,7 +809,9 @@ goto_buffer(
int count)
{
# if defined(FEAT_WINDOWS) && defined(HAS_SWAP_EXISTS_ACTION)
- buf_T *old_curbuf = curbuf;
+ bufref_T old_curbuf;
+
+ set_bufref(&old_curbuf, curbuf);
swap_exists_action = SEA_DIALOG;
# endif
@@ -838,7 +840,7 @@ goto_buffer(
# endif
}
else
- handle_swap_exists(old_curbuf);
+ handle_swap_exists(&old_curbuf);
# endif
}
#endif
@@ -849,7 +851,7 @@ goto_buffer(
* It is allowed for "old_curbuf" to be NULL or invalid.
*/
void
-handle_swap_exists(buf_T *old_curbuf)
+handle_swap_exists(bufref_T *old_curbuf)
{
# if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
cleanup_T cs;
@@ -857,6 +859,7 @@ handle_swap_exists(buf_T *old_curbuf)
#ifdef FEAT_SYN_HL
long old_tw = curbuf->b_p_tw;
#endif
+ buf_T *buf;
if (swap_exists_action == SEA_QUIT)
{
@@ -872,11 +875,14 @@ handle_swap_exists(buf_T *old_curbuf)
swap_exists_action = SEA_NONE; /* don't want it again */
swap_exists_did_quit = TRUE;
close_buffer(curwin, curbuf, DOBUF_UNLOAD, FALSE);
- if (!buf_valid(old_curbuf) || old_curbuf == curbuf)
- old_curbuf = buflist_new(NULL, NULL, 1L, BLN_CURBUF | BLN_LISTED);
- if (old_curbuf != NULL)
+ if (old_curbuf == NULL || !bufref_valid(old_curbuf)
+ || old_curbuf->br_buf == curbuf)
+ buf = buflist_new(NULL, NULL, 1L, BLN_CURBUF | BLN_LISTED);
+ else
+ buf = old_curbuf->br_buf;
+ if (buf != NULL)
{
- enter_buffer(old_curbuf);
+ enter_buffer(buf);
#ifdef FEAT_SYN_HL
if (old_tw != curbuf->b_p_tw)
check_colorcolumn(curwin);
diff --git a/src/channel.c b/src/channel.c
index bb818dcd17..2e88080414 100644
--- a/src/channel.c
+++ b/src/channel.c
@@ -362,7 +362,7 @@ channel_still_useful(channel_T *channel)
return TRUE;
/* If reading from or a buffer it's still useful. */
- if (channel->ch_part[PART_IN].ch_buffer != NULL)
+ if (channel->ch_part[PART_IN].ch_bufref.br_buf != NULL)
return TRUE;
/* If there is no callback then nobody can get readahead. If the fd is
@@ -379,9 +379,11 @@ channel_still_useful(channel_T *channel)
return (channel->ch_callback != NULL && (has_sock_msg
|| has_out_msg || has_err_msg))
|| ((channel->ch_part[PART_OUT].ch_callback != NULL
- || channel->ch_part[PART_OUT].ch_buffer) && has_out_msg)
+ || channel->ch_part[PART_OUT].ch_bufref.br_buf != NULL)
+ && has_out_msg)
|| ((channel->ch_part[PART_ERR].ch_callback != NULL
- || channel->ch_part[PART_ERR].ch_buffer) && has_err_msg);
+ || channel->ch_part[PART_ERR].ch_bufref.br_buf != NULL)
+ && has_err_msg);
}
/*
@@ -1046,19 +1048,19 @@ channel_set_job(channel_T *channel, job_T *job, jobopt_T *options)
{
chanpart_T *in_part = &channel->ch_part[PART_IN];
- in_part->ch_buffer = job->jv_in_buf;
+ set_bufref(&in_part->ch_bufref, job->jv_in_buf);
ch_logs(channel, "reading from buffer '%s'",
- (char *)in_part->ch_buffer->b_ffname);
+ (char *)in_part->ch_bufref.br_buf->b_ffname);
if (options->jo_set & JO_IN_TOP)
{
if (options->jo_in_top == 0 && !(options->jo_set & JO_IN_BOT))
{
/* Special mode: send last-but-one line when appending a line
* to the buffer. */
- in_part->ch_buffer->b_write_to_channel = TRUE;
+ in_part->ch_bufref.br_buf->b_write_to_channel = TRUE;
in_part->ch_buf_append = TRUE;
in_part->ch_buf_top =
- in_part->ch_buffer->b_ml.ml_line_count + 1;
+ in_part->ch_bufref.br_buf->b_ml.ml_line_count + 1;
}
else
in_part->ch_buf_top = options->jo_in_top;
@@ -1068,7 +1070,7 @@ channel_set_job(channel_T *channel, job_T *job, jobopt_T *options)
if (options->jo_set & JO_IN_BOT)
in_part->ch_buf_bot = options->jo_in_bot;
else
- in_part->ch_buf_bot = in_part->ch_buffer->b_ml.ml_line_count;
+ in_part->ch_buf_bot = in_part->ch_bufref.br_buf->b_ml.ml_line_count;
}
}
@@ -1229,7 +1231,7 @@ channel_set_options(channel_T *channel, jobopt_T *opt)
{
ch_logs(channel, "writing out to buffer '%s'",
(char *)buf->b_ffname);
- channel->ch_part[PART_OUT].ch_buffer = buf;
+ set_bufref(&channel->ch_part[PART_OUT].ch_bufref, buf);
}
}
}
@@ -1244,7 +1246,7 @@ channel_set_options(channel_T *channel, jobopt_T *opt)
if (!(opt->jo_set & JO_ERR_MODE))
channel->ch_part[PART_ERR].ch_mode = MODE_NL;
if (opt->jo_io[PART_ERR] == JIO_OUT)
- buf = channel->ch_part[PART_OUT].ch_buffer;
+ buf = channel->ch_part[PART_OUT].ch_bufref.br_buf;
else if (opt->jo_set & JO_ERR_BUF)
{
buf = buflist_findnr(opt->jo_io_buf[PART_ERR]);
@@ -1266,7 +1268,7 @@ channel_set_options(channel_T *channel, jobopt_T *opt)
{
ch_logs(channel, "writing err to buffer '%s'",
(char *)buf->b_ffname);
- channel->ch_part[PART_ERR].ch_buffer = buf;
+ set_bufref(&channel->ch_part[PART_ERR].ch_bufref, buf);
}
}
}
@@ -1407,15 +1409,15 @@ channel_write_in(channel_T *channel)
{
chanpart_T *in_part = &channel->ch_part[PART_IN];
linenr_T lnum;
- buf_T *buf = in_part->ch_buffer;
+ buf_T *buf = in_part->ch_bufref.br_buf;
int written = 0;
if (buf == NULL || in_part->ch_buf_append)
return; /* no buffer or using appending */
- if (!buf_valid(buf) || buf->b_ml.ml_mfp == NULL)
+ if (!bufref_valid(&in_part->ch_bufref) || buf->b_ml.ml_mfp == NULL)
{
/* buffer was wiped out or unloaded */
- in_part->ch_buffer = NULL;
+ in_part->ch_bufref.br_buf = NULL;
return;
}
@@ -1437,7 +1439,7 @@ channel_write_in(channel_T *channel)
if (lnum > buf->b_ml.ml_line_count)
{
/* Writing is done, no longer need the buffer. */
- in_part->ch_buffer = NULL;
+ in_part->ch_bufref.br_buf = NULL;
ch_log(channel, "Finished writing all lines to channel");
}
else
@@ -1459,11 +1461,11 @@ channel_buffer_free(buf_T *buf)
{
chanpart_T *ch_part = &channel->ch_part[part];
- if (ch_part->ch_buffer == buf)
+ if (ch_part->ch_bufref.br_buf == buf)
{
ch_logs(channel, "%s buffer has been wiped out",
part_names[part]);
- ch_part->ch_buffer = NULL;
+ ch_part->ch_bufref.br_buf = NULL;
}
}
}
@@ -1480,10 +1482,10 @@ channel_write_any_lines(void)
{
chanpart_T *in_part = &channel->ch_part[PART_IN];
- if (in_part->ch_buffer != NULL)
+ if (in_part->ch_bufref.br_buf != NULL)
{
if (in_part->ch_buf_append)
- channel_write_new_lines(in_part->ch_buffer);
+ channel_write_new_lines(in_part->ch_bufref.br_buf);
else
channel_write_in(channel);
}
@@ -1507,7 +1509,7 @@ channel_write_new_lines(buf_T *buf)
linenr_T lnum;
int written = 0;
- if (in_part->ch_buffer == buf && in_part->ch_buf_append)
+ if (in_part->ch_bufref.br_buf == buf && in_part->ch_buf_append)
{
if (in_part->ch_fd == INVALID_FD)
continue; /* pipe was closed */
@@ -2312,7 +2314,7 @@ append_to_buffer(buf_T *buffer, char_u *msg, channel_T *channel, int part)
{
chanpart_T *in_part = &ch->ch_part[PART_IN];
- if (in_part->ch_buffer == buffer)
+ if (in_part->ch_bufref.br_buf == buffer)
in_part->ch_buf_bot = buffer->b_ml.ml_line_count;
}
}
@@ -2374,11 +2376,11 @@ may_invoke_callback(channel_T *channel, int part)
partial = channel->ch_partial;
}
- buffer = channel->ch_part[part].ch_buffer;
- if (buffer != NULL && !buf_valid(buffer))
+ buffer = channel->ch_part[part].ch_bufref.br_buf;
+ if (buffer != NULL && !bufref_valid(&channel->ch_part[part].ch_bufref))
{
/* buffer was wiped out */
- channel->ch_part[part].ch_buffer = NULL;
+ channel->ch_part[part].ch_bufref.br_buf = NULL;
buffer = NULL;
}
@@ -2834,7 +2836,7 @@ channel_fill_wfds(int maxfd_arg, fd_set *wfds)
{
chanpart_T *in_part = &ch->ch_part[PART_IN];
- if (in_part->ch_fd != INVALID_FD && in_part->ch_buffer != NULL)
+ if (in_part->ch_fd != INVALID_FD && in_part->ch_bufref.br_buf != NULL)
{
FD_SET((int)in_part->ch_fd, wfds);
if ((int)in_part->ch_fd >= maxfd)
@@ -2857,7 +2859,7 @@ channel_fill_poll_write(int nfd_in, struct pollfd *fds)
{
chanpart_T *in_part = &ch->ch_part[PART_IN];
- if (in_part->ch_fd != INVALID_FD && in_part->ch_buffer != NULL)
+ if (in_part->ch_fd != INVALID_FD && in_part->ch_bufref.br_buf != NULL)
{
in_part->ch_poll_idx = nfd;
fds[nfd].fd = in_part->ch_fd;
@@ -3643,8 +3645,8 @@ channel_poll_check(int ret_in, void *fds_in)
{
if (in_part->ch_buf_append)
{
- if (in_part->ch_buffer != NULL)
- channel_write_new_lines(in_part->ch_buffer);
+ if (in_part->ch_bufref.br_buf != NULL)
+ channel_write_new_lines(in_part->ch_bufref.br_buf);
}
else
channel_write_in(channel);
@@ -3721,8 +3723,8 @@ channel_select_check(int ret_in, void *rfds_in, void *wfds_in)
{
if (in_part->ch_buf_append)
{
- if (in_part->ch_buffer != NULL)
- channel_write_new_lines(in_part->ch_buffer);
+ if (in_part->ch_bufref.br_buf != NULL)
+ channel_write_new_lines(in_part->ch_bufref.br_buf);
}
else
channel_write_in(channel);
diff --git a/src/diff.c b/src/diff.c
index 5e17943ec5..287f434bee 100644
--- a/src/diff.c
+++ b/src/diff.c
@@ -1069,8 +1069,9 @@ theend:
ex_diffsplit(exarg_T *eap)
{
win_T *old_curwin = curwin;
- buf_T *old_curbuf = curbuf;
+ bufref_T old_curbuf;
+ set_bufref(&old_curbuf, curbuf);
#ifdef FEAT_GUI
need_mouse_correct = TRUE;
#endif
@@ -1092,10 +1093,10 @@ ex_diffsplit(exarg_T *eap)
{
diff_win_options(old_curwin, TRUE);
- if (buf_valid(old_curbuf))
+ if (bufref_valid(&old_curbuf))
/* Move the cursor position to that of the old window. */
curwin->w_cursor.lnum = diff_get_corresponding_line(
- old_curbuf,
+ old_curbuf.br_buf,
old_curwin->w_cursor.lnum,
curbuf,
curwin->w_cursor.lnum);
@@ -1557,7 +1558,8 @@ diff_check(win_T *wp, linenr_T lnum)
/* Compare all lines. If they are equal the lines were inserted
* in some buffers, deleted in others, but not changed. */
for (i = 0; i < DB_COUNT; ++i)
- if (i != idx && curtab->tp_diffbuf[i] != NULL && dp->df_count[i] != 0)
+ if (i != idx && curtab->tp_diffbuf[i] != NULL
+ && dp->df_count[i] != 0)
if (!diff_equal_entry(dp, idx, i))
return -1;
}
diff --git a/src/eval.c b/src/eval.c
index b68fcfda55..a9504363d1 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -10503,8 +10503,9 @@ f_ch_getbufnr(typval_T *argvars, typval_T *rettv)
part = PART_IN;
else
part = PART_SOCK;
- if (channel->ch_part[part].ch_buffer != NULL)
- rettv->vval.v_number = channel->ch_part[part].ch_buffer->b_fnum;
+ if (channel->ch_part[part].ch_bufref.br_buf != NULL)
+ rettv->vval.v_number =
+ channel->ch_part[part].ch_bufref.br_buf->b_fnum;
}
}
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index 3e29d76892..7ec17b132c 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -3666,7 +3666,7 @@ do_ecmd(
buf_T *buf;
bufref_T bufref;
#if defined(FEAT_AUTOCMD) || defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
- buf_T *old_curbuf = curbuf;
+ bufref_T old_curbuf;
#endif
char_u *free_fname = NULL;
#ifdef FEAT_BROWSE
@@ -3691,6 +3691,9 @@ do_ecmd(
if (eap != NULL)
command = eap->do_ecmd_cmd;
+#if defined(FEAT_AUTOCMD) || defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
+ set_bufref(&old_curbuf, curbuf);
+#endif
if (fnum != 0)
{
@@ -3857,7 +3860,7 @@ do_ecmd(
/* autocommands may change curwin and curbuf */
if (oldwin != NULL)
oldwin = curwin;
- old_curbuf = curbuf;
+ set_bufref(&old_curbuf, curbuf);
#endif
}
if (buf == NULL)
@@ -3875,7 +3878,7 @@ do_ecmd(
* buffer. */
if (!bufref_valid(&bufref)
#ifdef FEAT_AUTOCMD
- || curbuf != old_curbuf
+ || curbuf != old_curbuf.br_buf
#endif
)
goto theend;
@@ -3934,7 +3937,7 @@ do_ecmd(
auto_buf = TRUE;
else
{
- if (curbuf == old_curbuf)
+ if (curbuf == old_curbuf.br_buf)
#endif
buf_copy_options(buf, BCO_ENTER);
@@ -4196,7 +4199,7 @@ do_ecmd(
#if defined(HAS_SWAP_EXISTS_ACTION)
if (swap_exists_action == SEA_QUIT)
retval = FAIL;
- handle_swap_exists(old_curbuf);
+ handle_swap_exists(&old_curbuf);
#endif
}
#ifdef FEAT_AUTOCMD
diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c
index eb06e385ec..c8980b44b7 100644
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -1693,6 +1693,7 @@ prof_def_func(void)
autowrite(buf_T *buf, int forceit)
{
int r;
+ bufref_T bufref;
if (!(p_aw || p_awa) || !p_write
#ifdef FEAT_QUICKFIX
@@ -1701,11 +1702,12 @@ autowrite(buf_T *buf, int forceit)
#endif
|| (!forceit && buf->b_p_ro) || buf->b_ffname == NULL)
return FAIL;
+ set_bufref(&bufref, buf);
r = buf_write_all(buf, forceit);
/* Writing may succeed but the buffer still changed, e.g., when there is a
* conversion error. We do want to return FAIL then. */
- if (buf_valid(buf) && bufIsChanged(buf))
+ if (bufref_valid(&bufref) && bufIsChanged(buf))
r = FAIL;
return r;
}
@@ -1723,10 +1725,15 @@ autowrite_all(void)
for (buf = firstbuf; buf; buf = buf->b_next)
if (bufIsChanged(buf) && !buf->b_p_ro)
{
+#ifdef FEAT_AUTOCMD
+ bufref_T bufref;
+
+ set_bufref(&bufref, buf);
+#endif
(void)buf_write_all(buf, FALSE);
#ifdef FEAT_AUTOCMD
/* an autocommand may have deleted the buffer */
- if (!buf_valid(buf))
+ if (!bufref_valid(&bufref))
buf = firstbuf;
#endif
}
@@ -1739,7 +1746,12 @@ autowrite_all(void)
int
check_changed(buf_T *buf, int flags)
{
- int forceit = (flags & CCGD_FORCEIT);
+ int forceit = (flags & CCGD_FORCEIT);
+#ifdef FEAT_AUTOCMD
+ bufref_T bufref;
+
+ set_bufref(&bufref, buf);
+#endif
if ( !forceit
&& bufIsChanged(buf)
@@ -1762,13 +1774,13 @@ check_changed(buf_T *buf, int flags)
))
++count;
# ifdef FEAT_AUTOCMD
- if (!buf_valid(buf))
+ if (!bufref_valid(&bufref))
/* Autocommand deleted buffer, oops! It's not changed now. */
return FALSE;
# endif
dialog_changed(buf, count > 1);
# ifdef FEAT_AUTOCMD
- if (!buf_valid(buf))
+ if (!bufref_valid(&bufref))
/* Autocommand deleted buffer, oops! It's not changed now. */
return FALSE;
# endif
@@ -1867,6 +1879,11 @@ dialog_changed(
)
&& !buf2->b_p_ro)
{
+#ifdef FEAT_AUTOCMD
+ bufref_T bufref;
+
+ set_bufref(&bufref, buf2);
+#endif
#ifdef FEAT_BROWSE
/* May get file name, when there is none */
browse_save_fname(buf2);
@@ -1877,7 +1894,7 @@ dialog_changed(
(void)buf_write_all(buf2, FALSE);
#ifdef FEAT_AUTOCMD
/* an autocommand may have deleted the buffer */
- if (!buf_valid(buf2))
+ if (!bufref_valid(&bufref))
buf2 = firstbuf;
#endif
}
@@ -1983,11 +2000,14 @@ check_changed_any(
continue;
if ((!hidden || buf->b_nwindows == 0) && bufIsChanged(buf))
{
+ bufref_T bufref;
+
+ set_bufref(&bufref, buf);
/* Try auto-writing the buffer. If this fails but the buffer no
* longer exists it's not changed, that's OK. */
if (check_changed(buf, (p_awa ? CCGD_AW : 0)
| CCGD_MULTWIN
- | CCGD_ALLBUF) && buf_valid(buf))
+ | CCGD_ALLBUF) && bufref_valid(&bufref))
break; /* didn't save - still changes */
}
}
@@ -2030,10 +2050,15 @@ check_changed_any(
FOR_ALL_TAB_WINDOWS(tp, wp)
if (wp->w_buffer == buf)
{
+# ifdef FEAT_AUTOCMD
+ bufref_T bufref;
+
+ set_bufref(&bufref, buf);
+# endif
goto_tabpage_win(tp, wp);
# ifdef FEAT_AUTOCMD
/* Paranoia: did autocms wipe out the buffer with changes? */
- if (!buf_valid(buf))
+ if (!bufref_valid(&bufref))
{
goto theend;
}
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 07fdaa94a0..646f7ec080 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -7322,8 +7322,11 @@ ex_win_close(
# if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
if ((p_confirm || cmdmod.confirm) && p_write)
{
+ bufref_T bufref;
+
+ set_bufref(&bufref, buf);
dialog_changed(buf, FALSE);
- if (buf_valid(buf) && bufIsChanged(buf))
+ if (bufref_valid(&bufref) && bufIsChanged(buf))
return;
need_hide = FALSE;
}
diff --git a/src/ex_getln.c b/src/ex_getln.c
index 36902e5c53..642e090107 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -1666,7 +1666,7 @@ getcmdline(
case Ctrl__: /* CTRL-_: switch language mode */
if (!p_ari)
break;
-#ifdef FEAT_FKMAP
+# ifdef FEAT_FKMAP
if (p_altkeymap)
{
cmd_fkmap = !cmd_fkmap;
@@ -1674,7 +1674,7 @@ getcmdline(
ccline.overstrike = FALSE;
}
else /* Hebrew is default */
-#endif
+# endif
cmd_hkmap = !cmd_hkmap;
goto cmdline_not_changed;
#endif
@@ -6655,9 +6655,9 @@ cmd_gchar(int offset)
ex_window(void)
{
struct cmdline_info save_ccline;
- buf_T *old_curbuf = curbuf;
+ bufref_T old_curbuf;
win_T *old_curwin = curwin;
- buf_T *bp;
+ bufref_T bufref;
win_T *wp;
int i;
linenr_T lnum;
@@ -6686,6 +6686,7 @@ ex_window(void)
beep_flush();
return K_IGNORE;
}
+ set_bufref(&old_curbuf, curbuf);
/* Save current window sizes. */
win_size_save(&winsizes);
@@ -6832,7 +6833,7 @@ ex_window(void)
/* Safety check: The old window or buffer was deleted: It's a bug when
* this happens! */
- if (!win_valid(old_curwin) || !buf_valid(old_curbuf))
+ if (!win_valid(old_curwin) || !bufref_valid(&old_curbuf))
{
cmdwin_result = Ctrl_C;
EMSG(_("E199: Active window or buffer deleted"));
@@ -6903,14 +6904,14 @@ ex_window(void)
curwin->w_p_cole = 0;
# endif
wp = curwin;
- bp = curbuf;
+ set_bufref(&bufref, curbuf);
win_goto(old_curwin);
win_close(wp, TRUE);
/* win_close() may have already wiped the buffer when 'bh' is
* set to 'wipe' */
- if (buf_valid(bp))
- close_buffer(NULL, bp, DOBUF_WIPE, FALSE);
+ if (bufref_valid(&bufref))
+ close_buffer(NULL, bufref.br_buf, DOBUF_WIPE, FALSE);
/* Restore window sizes. */
win_size_restore(&winsizes);
diff --git a/src/fileio.c b/src/fileio.c
index fa927ff349..14a6f31baa 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -3287,6 +3287,7 @@ buf_write(
int did_cmd = FALSE;
int nofile_err = FALSE;
int empty_memline = (buf->b_ml.ml_mfp == NULL);
+ bufref_T bufref;
/*
* Apply PRE autocommands.
@@ -3304,6 +3305,7 @@ buf_write(
/* set curwin/curbuf to buf and save a few things */
aucmd_prepbuf(&aco, buf);
+ set_bufref(&bufref, buf);
if (append)
{
@@ -3376,7 +3378,7 @@ buf_write(
* 2. The autocommands abort script processing.
* 3. If one of the "Cmd" autocommands was executed.
*/
- if (!buf_valid(buf))
+ if (!bufref_valid(&bufref))
buf = NULL;
if (buf == NULL || (buf->b_ml.ml_mfp == NULL && !empty_memline)
|| did_cmd || nofile_err
@@ -6675,10 +6677,13 @@ check_timestamps(
/* Only check buffers in a window. */
if (buf->b_nwindows > 0)
{
+ bufref_T bufref;
+
+ set_bufref(&bufref, buf);
n = buf_check_timestamp(buf, focus);
if (didit < n)
didit = n;
- if (n > 0 && !buf_valid(buf))
+ if (n > 0 && !bufref_valid(&bufref))
{
/* Autocommands have removed the buffer, start at the
* first one again. */
@@ -6766,6 +6771,7 @@ buf_check_timestamp(
char *mesg2 = "";
int helpmesg = FALSE;
int reload = FALSE;
+ char *reason;
#if defined(FEAT_CON_DIALOG) || defined(FEAT_GUI_DIALOG)
int can_reload = FALSE;
#endif
@@ -6778,8 +6784,10 @@ buf_check_timestamp(
static int busy = FALSE;
int n;
char_u *s;
+ bufref_T bufref;
+
+ set_bufref(&bufref, buf);
#endif
- char *reason;
/* If there is no file name, the buffer is not loaded, 'buftype' is
* set, we are in the middle of a save or being called recursively: ignore
@@ -6868,7 +6876,7 @@ buf_check_timestamp(
busy = FALSE;
if (n)
{
- if (!buf_valid(buf))
+ if (!bufref_valid(&bufref))
EMSG(_("E246: FileChangedShell autocommand deleted buffer"));
# ifdef FEAT_EVAL
s = get_vim_var_str(VV_FCS_CHOICE);
@@ -7026,7 +7034,7 @@ buf_check_timestamp(
#ifdef FEAT_AUTOCMD
/* Trigger FileChangedShell when the file was changed in any way. */
- if (buf_valid(buf) && retval != 0)
+ if (bufref_valid(&bufref) && retval != 0)
(void)apply_autocmds(EVENT_FILECHANGEDSHELLPOST,
buf->b_fname, buf->b_fname, FALSE, buf);
#endif
@@ -7053,6 +7061,7 @@ buf_reload(buf_T *buf, int orig_mode)
linenr_T old_topline;
int old_ro = buf->b_p_ro;
buf_T *savebuf;
+ bufref_T bufref;
int saved = OK;
aco_save_T aco;
int flags = READ_NEW;
@@ -7090,6 +7099,7 @@ buf_reload(buf_T *buf, int orig_mode)
{
/* Allocate a buffer without putting it in the buffer list. */
savebuf = buflist_new(NULL, NULL, (linenr_T)1, BLN_DUMMY);
+ set_bufref(&bufref, savebuf);
if (savebuf != NULL && buf == curbuf)
{
/* Open the memline. */
@@ -7122,7 +7132,7 @@ buf_reload(buf_T *buf, int orig_mode)
if (!aborting())
#endif
EMSG2(_("E321: Could not reload \"%s\""), buf->b_fname);
- if (savebuf != NULL && buf_valid(savebuf) && buf == curbuf)
+ if (savebuf != NULL && bufref_valid(&bufref) && buf == curbuf)
{
/* Put the text back from the save buffer. First
* delete any lines that readfile() added. */
@@ -7150,7 +7160,7 @@ buf_reload(buf_T *buf, int orig_mode)
}
vim_free(ea.cmd);
- if (savebuf != NULL && buf_valid(savebuf))
+ if (savebuf != NULL && bufref_valid(&bufref))
wipe_buffer(savebuf, FALSE);
#ifdef FEAT_DIFF
@@ -8739,6 +8749,7 @@ ex_doautoall(exarg_T *eap)
int retval;
aco_save_T aco;
buf_T *buf;
+ bufref_T bufref;
char_u *arg = eap->arg;
int call_do_modelines = check_nomodeline(&arg);
int did_aucmd;
@@ -8756,6 +8767,7 @@ ex_doautoall(exarg_T *eap)
{
/* find a window for this buffer and save some values */
aucmd_prepbuf(&aco, buf);
+ set_bufref(&bufref, buf);
/* execute the autocommands for this buffer */
retval = do_doautocmd(arg, FALSE, &did_aucmd);
@@ -8772,7 +8784,7 @@ ex_doautoall(exarg_T *eap)
aucmd_restbuf(&aco);
/* stop if there is some error or buffer was deleted */
- if (retval == FAIL || !buf_valid(buf))
+ if (retval == FAIL || !bufref_valid(&bufref))
break;
}
}
@@ -8898,7 +8910,7 @@ aucmd_prepbuf(
}
curbuf = buf;
aco->new_curwin = curwin;
- aco->new_curbuf = curbuf;
+ set_bufref(&aco->new_curbuf, curbuf);
}
/*
@@ -8992,16 +9004,16 @@ win_found:
* it was changed, we are still the same window and the buffer is
* valid. */
if (curwin == aco->new_curwin
- && curbuf != aco->new_curbuf
- && buf_valid(aco->new_curbuf)
- && aco->new_curbuf->b_ml.ml_mfp != NULL)
+ && curbuf != aco->new_curbuf.br_buf
+ && bufref_valid(&aco->new_curbuf)
+ && aco->new_curbuf.br_buf->b_ml.ml_mfp != NULL)
{
# if defined(FEAT_SYN_HL) || defined(FEAT_SPELL)
if (curwin->w_s == &curbuf->b_s)
- curwin->w_s = &aco->new_curbuf->b_s;
+ curwin->w_s = &aco->new_curbuf.br_buf->b_s;
# endif
--curbuf->b_nwindows;
- curbuf = aco->new_curbuf;
+ curbuf = aco->new_curbuf.br_buf;
curwin->w_buffer = curbuf;
++curbuf->b_nwindows;
}
@@ -9180,6 +9192,10 @@ has_funcundefined(void)
return (first_autopat[(int)EVENT_FUNCUNDEFINED] != NULL);
}
+/*
+ * Execute autocommands for "event" and file name "fname".
+ * Return TRUE if some commands were executed.
+ */
static int
apply_autocmds_group(
event_T event,
diff --git a/src/if_py_both.h b/src/if_py_both.h
index 50fd687d96..062f8226d7 100644
--- a/src/if_py_both.h
+++ b/src/if_py_both.h
@@ -3409,7 +3409,7 @@ set_option_value_for(
{
win_T *save_curwin = NULL;
tabpage_T *save_curtab = NULL;
- buf_T *save_curbuf = NULL;
+ bufref_T save_curbuf;
int set_ret = 0;
VimTryStart();
@@ -3431,7 +3431,7 @@ set_option_value_for(
case SREQ_BUF:
switch_buffer(&save_curbuf, (buf_T *)from);
set_ret = set_option_value_err(key, numval, stringval, opt_flags);
- restore_buffer(save_curbuf);
+ restore_buffer(&save_curbuf);
break;
case SREQ_GLOBAL:
set_ret = set_option_value_err(key, numval, stringval, opt_flags);
@@ -4273,17 +4273,17 @@ switch_to_win_for_buf(
buf_T *buf,
win_T **save_curwinp,
tabpage_T **save_curtabp,
- buf_T **save_curbufp)
+ bufref_T *save_curbuf)
{
win_T *wp;
tabpage_T *tp;
if (find_win_for_buf(buf, &wp, &tp) == FAIL)
- switch_buffer(save_curbufp, buf);
+ switch_buffer(save_curbuf, buf);
else if (switch_win(save_curwinp, save_curtabp, wp, tp, TRUE) == FAIL)
{
restore_win(*save_curwinp, *save_curtabp, TRUE);
- switch_buffer(save_curbufp, buf);
+ switch_buffer(save_curbuf, buf);
}
}
@@ -4291,9 +4291,9 @@ switch_to_win_for_buf(
restore_win_for_buf(
win_T *save_curwin,
tabpage_T *save_curtab,
- buf_T *save_curbuf)
+ bufref_T *save_curbuf)
{
- if (save_curbuf == NULL)
+ if (save_curbuf->br_buf == NULL)
restore_win(save_curwin, save_curtab, TRUE);
else
restore_buffer(save_curbuf);
@@ -4311,7 +4311,7 @@ restore_win_for_buf(
static int
SetBufferLine(buf_T *buf, PyInt n, PyObject *line, PyInt *len_change)
{
- buf_T *save_curbuf = NULL;
+ bufref_T save_curbuf = {NULL, 0};
win_T *save_curwin = NULL;
tabpage_T *save_curtab = NULL;
@@ -4336,13 +4336,13 @@ SetBufferLine(buf_T *buf, PyInt n, PyObject *line, PyInt *len_change)
{
if (buf == curbuf)
py_fix_cursor((linenr_T)n, (linenr_T)n + 1, (linenr_T)-1);
- if (save_curbuf == NULL)
+ if (save_curbuf.br_buf == NULL)
/* Only adjust marks if we managed to switch to a window that
* holds the buffer, otherwise line numbers will be invalid. */
deleted_lines_mark((linenr_T)n, 1L);
}
- restore_win_for_buf(save_curwin, save_curtab, save_curbuf);
+ restore_win_for_buf(save_curwin, save_curtab, &save_curbuf);
if (VimTryEnd())
return FAIL;
@@ -4378,7 +4378,7 @@ SetBufferLine(buf_T *buf, PyInt n, PyObject *line, PyInt *len_change)
else
changed_bytes((linenr_T)n, 0);
- restore_win_for_buf(save_curwin, save_curtab, save_curbuf);
+ restore_win_for_buf(save_curwin, save_curtab, &save_curbuf);
/* Check that the cursor is not beyond the end of the line now. */
if (buf == curbuf)
@@ -4415,7 +4415,7 @@ SetBufferLineList(
PyObject *list,
PyInt *len_change)
{
- buf_T *save_curbuf = NULL;
+ bufref_T save_curbuf = {NULL, 0};
win_T *save_curwin = NULL;
tabpage_T *save_curtab = NULL;
@@ -4446,17 +4446,18 @@ SetBufferLineList(
break;
}
}
- if (buf == curbuf && (save_curwin != NULL || save_curbuf == NULL))
+ if (buf == curbuf && (sa