Patch 7.4.2024
Problem: More buf_valid() calls can be optimized.
Solution: Use bufref_valid() instead.
Files: src/buffer.c, src/ex_cmds.c, src/structs.h, src/channel.c,
src/diff.c, src/eval.c, src/ex_cmds2.c, src/ex_docmd.c,
src/ex_getln.c, src/fileio.c, src/main.c, src/misc2.c,
src/netbeans.c, src/quickfix.c, src/spell.c, src/term.c,
src/if_py_both.h, src/window.c, src/proto/buffer.pro,
src/proto/window.pro
*** ../vim-7.4.2023/src/buffer.c 2016-07-10 20:27:27.423946553 +0200
--- src/buffer.c 2016-07-10 20:36:53.963431243 +0200
***************
*** 83,89 ****
{
int retval = OK;
#ifdef FEAT_AUTOCMD
! buf_T *old_curbuf;
#endif
#ifdef FEAT_SYN_HL
long old_tw = curbuf->b_p_tw;
--- 83,89 ----
{
int retval = OK;
#ifdef FEAT_AUTOCMD
! bufref_T old_curbuf;
#endif
#ifdef FEAT_SYN_HL
long old_tw = curbuf->b_p_tw;
***************
*** 129,135 ****
#ifdef FEAT_AUTOCMD
/* The autocommands in readfile() may change the buffer, but only AFTER
* reading the file. */
! old_curbuf = curbuf;
modified_was_set = FALSE;
#endif
--- 129,135 ----
#ifdef FEAT_AUTOCMD
/* The autocommands in readfile() may change the buffer, but only AFTER
* reading the file. */
! set_bufref(&old_curbuf, curbuf);
modified_was_set = FALSE;
#endif
***************
*** 284,295 ****
* 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)
{
aco_save_T aco;
/* Go to the buffer that was opened. */
! aucmd_prepbuf(&aco, old_curbuf);
#endif
do_modelines(0);
curbuf->b_flags &= ~(BF_CHECK_RO | BF_NEVERLOADED);
--- 284,295 ----
* The autocommands may have changed the current buffer. Apply the
* modelines to the correct buffer, if it still exists and is loaded.
*/
! 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.br_buf);
#endif
do_modelines(0);
curbuf->b_flags &= ~(BF_CHECK_RO | BF_NEVERLOADED);
***************
*** 809,815 ****
int count)
{
# if defined(FEAT_WINDOWS) && defined(HAS_SWAP_EXISTS_ACTION)
! buf_T *old_curbuf = curbuf;
swap_exists_action = SEA_DIALOG;
# endif
--- 809,817 ----
int count)
{
# if defined(FEAT_WINDOWS) && defined(HAS_SWAP_EXISTS_ACTION)
! bufref_T old_curbuf;
!
! set_bufref(&old_curbuf, curbuf);
swap_exists_action = SEA_DIALOG;
# endif
***************
*** 838,844 ****
# endif
}
else
! handle_swap_exists(old_curbuf);
# endif
}
#endif
--- 840,846 ----
# endif
}
else
! handle_swap_exists(&old_curbuf);
# endif
}
#endif
***************
*** 849,855 ****
* It is allowed for "old_curbuf" to be NULL or invalid.
*/
void
! handle_swap_exists(buf_T *old_curbuf)
{
# if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
cleanup_T cs;
--- 851,857 ----
* It is allowed for "old_curbuf" to be NULL or invalid.
*/
void
! handle_swap_exists(bufref_T *old_curbuf)
{
# if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
cleanup_T cs;
***************
*** 857,862 ****
--- 859,865 ----
#ifdef FEAT_SYN_HL
long old_tw = curbuf->b_p_tw;
#endif
+ buf_T *buf;
if (swap_exists_action == SEA_QUIT)
{
***************
*** 872,882 ****
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)
{
! enter_buffer(old_curbuf);
#ifdef FEAT_SYN_HL
if (old_tw != curbuf->b_p_tw)
check_colorcolumn(curwin);
--- 875,888 ----
swap_exists_action = SEA_NONE; /* don't want it again */
swap_exists_did_quit = TRUE;
close_buffer(curwin, curbuf, DOBUF_UNLOAD, FALSE);
! 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(buf);
#ifdef FEAT_SYN_HL
if (old_tw != curbuf->b_p_tw)
check_colorcolumn(curwin);
*** ../vim-7.4.2023/src/ex_cmds.c 2016-07-10 19:03:47.699212552 +0200
--- src/ex_cmds.c 2016-07-10 20:39:58.872652801 +0200
***************
*** 3666,3672 ****
buf_T *buf;
bufref_T bufref;
#if defined(FEAT_AUTOCMD) || defined(FEAT_GUI_DIALOG) ||
defined(FEAT_CON_DIALOG)
! buf_T *old_curbuf = curbuf;
#endif
char_u *free_fname = NULL;
#ifdef FEAT_BROWSE
--- 3666,3672 ----
buf_T *buf;
bufref_T bufref;
#if defined(FEAT_AUTOCMD) || defined(FEAT_GUI_DIALOG) ||
defined(FEAT_CON_DIALOG)
! bufref_T old_curbuf;
#endif
char_u *free_fname = NULL;
#ifdef FEAT_BROWSE
***************
*** 3691,3696 ****
--- 3691,3699 ----
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,3863 ****
/* autocommands may change curwin and curbuf */
if (oldwin != NULL)
oldwin = curwin;
! old_curbuf = curbuf;
#endif
}
if (buf == NULL)
--- 3860,3866 ----
/* autocommands may change curwin and curbuf */
if (oldwin != NULL)
oldwin = curwin;
! set_bufref(&old_curbuf, curbuf);
#endif
}
if (buf == NULL)
***************
*** 3875,3881 ****
* buffer. */
if (!bufref_valid(&bufref)
#ifdef FEAT_AUTOCMD
! || curbuf != old_curbuf
#endif
)
goto theend;
--- 3878,3884 ----
* buffer. */
if (!bufref_valid(&bufref)
#ifdef FEAT_AUTOCMD
! || curbuf != old_curbuf.br_buf
#endif
)
goto theend;
***************
*** 3934,3940 ****
auto_buf = TRUE;
else
{
! if (curbuf == old_curbuf)
#endif
buf_copy_options(buf, BCO_ENTER);
--- 3937,3943 ----
auto_buf = TRUE;
else
{
! if (curbuf == old_curbuf.br_buf)
#endif
buf_copy_options(buf, BCO_ENTER);
***************
*** 4196,4202 ****
#if defined(HAS_SWAP_EXISTS_ACTION)
if (swap_exists_action == SEA_QUIT)
retval = FAIL;
! handle_swap_exists(old_curbuf);
#endif
}
#ifdef FEAT_AUTOCMD
--- 4199,4205 ----
#if defined(HAS_SWAP_EXISTS_ACTION)
if (swap_exists_action == SEA_QUIT)
retval = FAIL;
! handle_swap_exists(&old_curbuf);
#endif
}
#ifdef FEAT_AUTOCMD
*** ../vim-7.4.2023/src/structs.h 2016-07-10 18:21:45.724884205 +0200
--- src/structs.h 2016-07-10 21:23:43.885300214 +0200
***************
*** 1431,1437 ****
char_u *ch_callback; /* call when a msg is not handled */
partial_T *ch_partial;
! buf_T *ch_buffer; /* buffer to read from or write to */
int ch_nomodifiable; /* TRUE when buffer can be
'nomodifiable' */
int ch_nomod_error; /* TRUE when e_modifiable was given */
int ch_buf_append; /* write appended lines instead top-bot
*/
--- 1431,1437 ----
char_u *ch_callback; /* call when a msg is not handled */
partial_T *ch_partial;
! bufref_T ch_bufref; /* buffer to read from or write to */
int ch_nomodifiable; /* TRUE when buffer can be
'nomodifiable' */
int ch_nomod_error; /* TRUE when e_modifiable was given */
int ch_buf_append; /* write appended lines instead top-bot
*/
***************
*** 2925,2931 ****
int use_aucmd_win; /* using aucmd_win */
win_T *save_curwin; /* saved curwin */
win_T *new_curwin; /* new curwin */
! buf_T *new_curbuf; /* new curbuf */
char_u *globaldir; /* saved value of globaldir */
#endif
} aco_save_T;
--- 2925,2931 ----
int use_aucmd_win; /* using aucmd_win */
win_T *save_curwin; /* saved curwin */
win_T *new_curwin; /* new curwin */
! bufref_T new_curbuf; /* new curbuf */
char_u *globaldir; /* saved value of globaldir */
#endif
} aco_save_T;
*** ../vim-7.4.2023/src/channel.c 2016-07-07 20:45:00.740424639 +0200
--- src/channel.c 2016-07-10 20:52:13.293625314 +0200
***************
*** 362,368 ****
return TRUE;
/* If reading from or a buffer it's still useful. */
! if (channel->ch_part[PART_IN].ch_buffer != NULL)
return TRUE;
/* If there is no callback then nobody can get readahead. If the fd is
--- 362,368 ----
return TRUE;
/* If reading from or a buffer it's still useful. */
! 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,387 ****
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_ERR].ch_callback != NULL
! || channel->ch_part[PART_ERR].ch_buffer) && has_err_msg);
}
/*
--- 379,389 ----
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_bufref.br_buf != NULL)
! && has_out_msg)
|| ((channel->ch_part[PART_ERR].ch_callback != NULL
! || channel->ch_part[PART_ERR].ch_bufref.br_buf != NULL)
! && has_err_msg);
}
/*
***************
*** 1046,1064 ****
{
chanpart_T *in_part = &channel->ch_part[PART_IN];
! in_part->ch_buffer = job->jv_in_buf;
ch_logs(channel, "reading from buffer '%s'",
! (char *)in_part->ch_buffer->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_buf_append = TRUE;
in_part->ch_buf_top =
! in_part->ch_buffer->b_ml.ml_line_count + 1;
}
else
in_part->ch_buf_top = options->jo_in_top;
--- 1048,1066 ----
{
chanpart_T *in_part = &channel->ch_part[PART_IN];
! set_bufref(&in_part->ch_bufref, job->jv_in_buf);
ch_logs(channel, "reading from buffer '%s'",
! (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_bufref.br_buf->b_write_to_channel = TRUE;
in_part->ch_buf_append = TRUE;
in_part->ch_buf_top =
! in_part->ch_bufref.br_buf->b_ml.ml_line_count + 1;
}
else
in_part->ch_buf_top = options->jo_in_top;
***************
*** 1068,1074 ****
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;
}
}
--- 1070,1076 ----
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_bufref.br_buf->b_ml.ml_line_count;
}
}
***************
*** 1229,1235 ****
{
ch_logs(channel, "writing out to buffer '%s'",
(char *)buf->b_ffname);
! channel->ch_part[PART_OUT].ch_buffer = buf;
}
}
}
--- 1231,1237 ----
{
ch_logs(channel, "writing out to buffer '%s'",
(char *)buf->b_ffname);
! set_bufref(&channel->ch_part[PART_OUT].ch_bufref, buf);
}
}
}
***************
*** 1244,1250 ****
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;
else if (opt->jo_set & JO_ERR_BUF)
{
buf = buflist_findnr(opt->jo_io_buf[PART_ERR]);
--- 1246,1252 ----
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_bufref.br_buf;
else if (opt->jo_set & JO_ERR_BUF)
{
buf = buflist_findnr(opt->jo_io_buf[PART_ERR]);
***************
*** 1266,1272 ****
{
ch_logs(channel, "writing err to buffer '%s'",
(char *)buf->b_ffname);
! channel->ch_part[PART_ERR].ch_buffer = buf;
}
}
}
--- 1268,1274 ----
{
ch_logs(channel, "writing err to buffer '%s'",
(char *)buf->b_ffname);
! set_bufref(&channel->ch_part[PART_ERR].ch_bufref, buf);
}
}
}
***************
*** 1407,1421 ****
{
chanpart_T *in_part = &channel->ch_part[PART_IN];
linenr_T lnum;
! buf_T *buf = in_part->ch_buffer;
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)
{
/* buffer was wiped out or unloaded */
! in_part->ch_buffer = NULL;
return;
}
--- 1409,1423 ----
{
chanpart_T *in_part = &channel->ch_part[PART_IN];
linenr_T lnum;
! 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 (!bufref_valid(&in_part->ch_bufref) || buf->b_ml.ml_mfp == NULL)
{
/* buffer was wiped out or unloaded */
! in_part->ch_bufref.br_buf = NULL;
return;
}
***************
*** 1437,1443 ****
if (lnum > buf->b_ml.ml_line_count)
{
/* Writing is done, no longer need the buffer. */
! in_part->ch_buffer = NULL;
ch_log(channel, "Finished writing all lines to channel");
}
else
--- 1439,1445 ----
if (lnum > buf->b_ml.ml_line_count)
{
/* Writing is done, no longer need the buffer. */
! in_part->ch_bufref.br_buf = NULL;
ch_log(channel, "Finished writing all lines to channel");
}
else
***************
*** 1459,1469 ****
{
chanpart_T *ch_part = &channel->ch_part[part];
! if (ch_part->ch_buffer == buf)
{
ch_logs(channel, "%s buffer has been wiped out",
part_names[part]);
! ch_part->ch_buffer = NULL;
}
}
}
--- 1461,1471 ----
{
chanpart_T *ch_part = &channel->ch_part[part];
! if (ch_part->ch_bufref.br_buf == buf)
{
ch_logs(channel, "%s buffer has been wiped out",
part_names[part]);
! ch_part->ch_bufref.br_buf = NULL;
}
}
}
***************
*** 1480,1489 ****
{
chanpart_T *in_part = &channel->ch_part[PART_IN];
! if (in_part->ch_buffer != NULL)
{
if (in_part->ch_buf_append)
! channel_write_new_lines(in_part->ch_buffer);
else
channel_write_in(channel);
}
--- 1482,1491 ----
{
chanpart_T *in_part = &channel->ch_part[PART_IN];
! if (in_part->ch_bufref.br_buf != NULL)
{
if (in_part->ch_buf_append)
! channel_write_new_lines(in_part->ch_bufref.br_buf);
else
channel_write_in(channel);
}
***************
*** 1507,1513 ****
linenr_T lnum;
int written = 0;
! if (in_part->ch_buffer == buf && in_part->ch_buf_append)
{
if (in_part->ch_fd == INVALID_FD)
continue; /* pipe was closed */
--- 1509,1515 ----
linenr_T lnum;
int written = 0;
! 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,2318 ****
{
chanpart_T *in_part = &ch->ch_part[PART_IN];
! if (in_part->ch_buffer == buffer)
in_part->ch_buf_bot = buffer->b_ml.ml_line_count;
}
}
--- 2314,2320 ----
{
chanpart_T *in_part = &ch->ch_part[PART_IN];
! if (in_part->ch_bufref.br_buf == buffer)
in_part->ch_buf_bot = buffer->b_ml.ml_line_count;
}
}
***************
*** 2374,2384 ****
partial = channel->ch_partial;
}
! buffer = channel->ch_part[part].ch_buffer;
! if (buffer != NULL && !buf_valid(buffer))
{
/* buffer was wiped out */
! channel->ch_part[part].ch_buffer = NULL;
buffer = NULL;
}
--- 2376,2386 ----
partial = channel->ch_partial;
}
! 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_bufref.br_buf = NULL;
buffer = NULL;
}
***************
*** 2834,2840 ****
{
chanpart_T *in_part = &ch->ch_part[PART_IN];
! if (in_part->ch_fd != INVALID_FD && in_part->ch_buffer != NULL)
{
FD_SET((int)in_part->ch_fd, wfds);
if ((int)in_part->ch_fd >= maxfd)
--- 2836,2842 ----
{
chanpart_T *in_part = &ch->ch_part[PART_IN];
! 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,2863 ****
{
chanpart_T *in_part = &ch->ch_part[PART_IN];
! if (in_part->ch_fd != INVALID_FD && in_part->ch_buffer != NULL)
{
in_part->ch_poll_idx = nfd;
fds[nfd].fd = in_part->ch_fd;
--- 2859,2865 ----
{
chanpart_T *in_part = &ch->ch_part[PART_IN];
! 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,3650 ****
{
if (in_part->ch_buf_append)
{
! if (in_part->ch_buffer != NULL)
! channel_write_new_lines(in_part->ch_buffer);
}
else
channel_write_in(channel);
--- 3645,3652 ----
{
if (in_part->ch_buf_append)
{
! if (in_part->ch_bufref.br_buf != NULL)
! channel_write_new_lines(in_part->ch_bufref.br_buf);
}
else
channel_write_in(channel);
***************
*** 3721,3728 ****
{
if (in_part->ch_buf_append)
{
! if (in_part->ch_buffer != NULL)
! channel_write_new_lines(in_part->ch_buffer);
}
else
channel_write_in(channel);
--- 3723,3730 ----
{
if (in_part->ch_buf_append)
{
! if (in_part->ch_bufref.br_buf != NULL)
! channel_write_new_lines(in_part->ch_bufref.br_buf);
}
else
channel_write_in(channel);
*** ../vim-7.4.2023/src/diff.c 2016-07-01 17:17:13.270267053 +0200
--- src/diff.c 2016-07-10 21:36:07.862171869 +0200
***************
*** 1069,1076 ****
ex_diffsplit(exarg_T *eap)
{
win_T *old_curwin = curwin;
! buf_T *old_curbuf = curbuf;
#ifdef FEAT_GUI
need_mouse_correct = TRUE;
#endif
--- 1069,1077 ----
ex_diffsplit(exarg_T *eap)
{
win_T *old_curwin = curwin;
! bufref_T old_curbuf;
+ set_bufref(&old_curbuf, curbuf);
#ifdef FEAT_GUI
need_mouse_correct = TRUE;
#endif
***************
*** 1092,1101 ****
{
diff_win_options(old_curwin, TRUE);
! if (buf_valid(old_curbuf))
/* Move the cursor position to that of the old window. */
curwin->w_cursor.lnum = diff_get_corresponding_line(
! old_curbuf,
old_curwin->w_cursor.lnum,
curbuf,
curwin->w_cursor.lnum);
--- 1093,1102 ----
{
diff_win_options(old_curwin, TRUE);
! 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.br_buf,
old_curwin->w_cursor.lnum,
curbuf,
curwin->w_cursor.lnum);
***************
*** 1557,1563 ****
/* 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 (!diff_equal_entry(dp, idx, i))
return -1;
}
--- 1558,1565 ----
/* 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 (!diff_equal_entry(dp, idx, i))
return -1;
}
*** ../vim-7.4.2023/src/eval.c 2016-07-10 19:22:49.194149187 +0200
--- src/eval.c 2016-07-10 20:50:22.415289865 +0200
***************
*** 10503,10510 ****
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;
}
}
--- 10503,10511 ----
part = PART_IN;
else
part = PART_SOCK;
! if (channel->ch_part[part].ch_bufref.br_buf != NULL)
! rettv->vval.v_number =
! channel->ch_part[part].ch_bufref.br_buf->b_fnum;
}
}
*** ../vim-7.4.2023/src/ex_cmds2.c 2016-07-02 22:07:16.992688114 +0200
--- src/ex_cmds2.c 2016-07-10 21:01:34.013212165 +0200
***************
*** 1693,1698 ****
--- 1693,1699 ----
autowrite(buf_T *buf, int forceit)
{
int r;
+ bufref_T bufref;
if (!(p_aw || p_awa) || !p_write
#ifdef FEAT_QUICKFIX
***************
*** 1701,1711 ****
#endif
|| (!forceit && buf->b_p_ro) || buf->b_ffname == NULL)
return FAIL;
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))
r = FAIL;
return r;
}
--- 1702,1713 ----
#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 (bufref_valid(&bufref) && bufIsChanged(buf))
r = FAIL;
return r;
}
***************
*** 1723,1732 ****
for (buf = firstbuf; buf; buf = buf->b_next)
if (bufIsChanged(buf) && !buf->b_p_ro)
{
(void)buf_write_all(buf, FALSE);
#ifdef FEAT_AUTOCMD
/* an autocommand may have deleted the buffer */
! if (!buf_valid(buf))
buf = firstbuf;
#endif
}
--- 1725,1739 ----
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 (!bufref_valid(&bufref))
buf = firstbuf;
#endif
}
***************
*** 1739,1745 ****
int
check_changed(buf_T *buf, int flags)
{
! int forceit = (flags & CCGD_FORCEIT);
if ( !forceit
&& bufIsChanged(buf)
--- 1746,1757 ----
int
check_changed(buf_T *buf, int flags)
{
! int forceit = (flags & CCGD_FORCEIT);
! #ifdef FEAT_AUTOCMD
! bufref_T bufref;
!
! set_bufref(&bufref, buf);
! #endif
if ( !forceit
&& bufIsChanged(buf)
***************
*** 1762,1774 ****
))
++count;
# ifdef FEAT_AUTOCMD
! if (!buf_valid(buf))
/* Autocommand deleted buffer, oops! It's not changed now. */
return FALSE;
# endif
dialog_changed(buf, count > 1);
# ifdef FEAT_AUTOCMD
! if (!buf_valid(buf))
/* Autocommand deleted buffer, oops! It's not changed now. */
return FALSE;
# endif
--- 1774,1786 ----
))
++count;
# ifdef FEAT_AUTOCMD
! 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 (!bufref_valid(&bufref))
/* Autocommand deleted buffer, oops! It's not changed now. */
return FALSE;
# endif
***************
*** 1867,1872 ****
--- 1879,1889 ----
)
&& !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,1883 ****
(void)buf_write_all(buf2, FALSE);
#ifdef FEAT_AUTOCMD
/* an autocommand may have deleted the buffer */
! if (!buf_valid(buf2))
buf2 = firstbuf;
#endif
}
--- 1894,1900 ----
(void)buf_write_all(buf2, FALSE);
#ifdef FEAT_AUTOCMD
/* an autocommand may have deleted the buffer */
! if (!bufref_valid(&bufref))
buf2 = firstbuf;
#endif
}
***************
*** 1983,1993 ****
continue;
if ((!hidden || buf->b_nwindows == 0) && bufIsChanged(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))
break; /* didn't save - still changes */
}
}
--- 2000,2013 ----
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) && bufref_valid(&bufref))
break; /* didn't save - still changes */
}
}
***************
*** 2030,2039 ****
FOR_ALL_TAB_WINDOWS(tp, wp)
if (wp->w_buffer == buf)
{
goto_tabpage_win(tp, wp);
# ifdef FEAT_AUTOCMD
/* Paranoia: did autocms wipe out the buffer with changes? */
! if (!buf_valid(buf))
{
goto theend;
}
--- 2050,2064 ----
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 (!bufref_valid(&bufref))
{
goto theend;
}
*** ../vim-7.4.2023/src/ex_docmd.c 2016-07-09 18:49:47.202419946 +0200
--- src/ex_docmd.c 2016-07-10 20:59:58.014650090 +0200
***************
*** 7322,7329 ****
# if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
if ((p_confirm || cmdmod.confirm) && p_write)
{
dialog_changed(buf, FALSE);
! if (buf_valid(buf) && bufIsChanged(buf))
return;
need_hide = FALSE;
}
--- 7322,7332 ----
# 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 (bufref_valid(&bufref) && bufIsChanged(buf))
return;
need_hide = FALSE;
}
*** ../vim-7.4.2023/src/ex_getln.c 2016-07-01 18:16:47.489936307 +0200
--- src/ex_getln.c 2016-07-10 21:03:04.703853716 +0200
***************
*** 1666,1672 ****
case Ctrl__: /* CTRL-_: switch language mode */
if (!p_ari)
break;
! #ifdef FEAT_FKMAP
if (p_altkeymap)
{
cmd_fkmap = !cmd_fkmap;
--- 1666,1672 ----
case Ctrl__: /* CTRL-_: switch language mode */
if (!p_ari)
break;
! # ifdef FEAT_FKMAP
if (p_altkeymap)
{
cmd_fkmap = !cmd_fkmap;
***************
*** 1674,1680 ****
ccline.overstrike = FALSE;
}
else /* Hebrew is default */
! #endif
cmd_hkmap = !cmd_hkmap;
goto cmdline_not_changed;
#endif
--- 1674,1680 ----
ccline.overstrike = FALSE;
}
else /* Hebrew is default */
! # endif
cmd_hkmap = !cmd_hkmap;
goto cmdline_not_changed;
#endif
***************
*** 6655,6663 ****
ex_window(void)
{
struct cmdline_info save_ccline;
! buf_T *old_curbuf = curbuf;
win_T *old_curwin = curwin;
! buf_T *bp;
win_T *wp;
int i;
linenr_T lnum;
--- 6655,6663 ----
ex_window(void)
{
struct cmdline_info save_ccline;
! bufref_T old_curbuf;
win_T *old_curwin = curwin;
! bufref_T bufref;
win_T *wp;
int i;
linenr_T lnum;
***************
*** 6686,6691 ****
--- 6686,6692 ----
beep_flush();
return K_IGNORE;
}
+ set_bufref(&old_curbuf, curbuf);
/* Save current window sizes. */
win_size_save(&winsizes);
***************
*** 6832,6838 ****
/* 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))
{
cmdwin_result = Ctrl_C;
EMSG(_("E199: Active window or buffer deleted"));
--- 6833,6839 ----
/* Safety check: The old window or buffer was deleted: It's a bug when
* this happens! */
! if (!win_valid(old_curwin) || !bufref_valid(&old_curbuf))
{
cmdwin_result = Ctrl_C;
EMSG(_("E199: Active window or buffer deleted"));
***************
*** 6903,6916 ****
curwin->w_p_cole = 0;
# endif
wp = curwin;
! bp = 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);
/* Restore window sizes. */
win_size_restore(&winsizes);
--- 6904,6917 ----
curwin->w_p_cole = 0;
# endif
wp = curwin;
! 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 (bufref_valid(&bufref))
! close_buffer(NULL, bufref.br_buf, DOBUF_WIPE, FALSE);
/* Restore window sizes. */
win_size_restore(&winsizes);
*** ../vim-7.4.2023/src/fileio.c 2016-07-01 20:03:38.255919891 +0200
--- src/fileio.c 2016-07-10 21:26:38.902682733 +0200
***************
*** 3287,3292 ****
--- 3287,3293 ----
int did_cmd = FALSE;
int nofile_err = FALSE;
int empty_memline = (buf->b_ml.ml_mfp == NULL);
+ bufref_T bufref;
/*
* Apply PRE autocommands.
***************
*** 3304,3309 ****
--- 3305,3311 ----
/* set curwin/curbuf to buf and save a few things */
aucmd_prepbuf(&aco, buf);
+ set_bufref(&bufref, buf);
if (append)
{
***************
*** 3376,3382 ****
* 2. The autocommands abort script processing.
* 3. If one of the "Cmd" autocommands was executed.
*/
! if (!buf_valid(buf))
buf = NULL;
if (buf == NULL || (buf->b_ml.ml_mfp == NULL && !empty_memline)
|| did_cmd || nofile_err
--- 3378,3384 ----
* 2. The autocommands abort script processing.
* 3. If one of the "Cmd" autocommands was executed.
*/
! if (!bufref_valid(&bufref))
buf = NULL;
if (buf == NULL || (buf->b_ml.ml_mfp == NULL && !empty_memline)
|| did_cmd || nofile_err
***************
*** 6675,6684 ****
/* Only check buffers in a window. */
if (buf->b_nwindows > 0)
{
n = buf_check_timestamp(buf, focus);
if (didit < n)
didit = n;
! if (n > 0 && !buf_valid(buf))
{
/* Autocommands have removed the buffer, start at the
* first one again. */
--- 6677,6689 ----
/* 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 && !bufref_valid(&bufref))
{
/* Autocommands have removed the buffer, start at the
* first one again. */
***************
*** 6766,6771 ****
--- 6771,6777 ----
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,6785 ****
static int busy = FALSE;
int n;
char_u *s;
#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
--- 6784,6793 ----
static int busy = FALSE;
int n;
char_u *s;
+ bufref_T bufref;
+
+ set_bufref(&bufref, buf);
#endif
/* 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,6874 ****
busy = FALSE;
if (n)
{
! if (!buf_valid(buf))
EMSG(_("E246: FileChangedShell autocommand deleted
buffer"));
# ifdef FEAT_EVAL
s = get_vim_var_str(VV_FCS_CHOICE);
--- 6876,6882 ----
busy = FALSE;
if (n)
{
! if (!bufref_valid(&bufref))
EMSG(_("E246: FileChangedShell autocommand deleted
buffer"));
# ifdef FEAT_EVAL
s = get_vim_var_str(VV_FCS_CHOICE);
***************
*** 7026,7032 ****
#ifdef FEAT_AUTOCMD
/* Trigger FileChangedShell when the file was changed in any way. */
! if (buf_valid(buf) && retval != 0)
(void)apply_autocmds(EVENT_FILECHANGEDSHELLPOST,
buf->b_fname, buf->b_fname, FALSE, buf);
#endif
--- 7034,7040 ----
#ifdef FEAT_AUTOCMD
/* Trigger FileChangedShell when the file was changed in any way. */
! if (bufref_valid(&bufref) && retval != 0)
(void)apply_autocmds(EVENT_FILECHANGEDSHELLPOST,
buf->b_fname, buf->b_fname, FALSE, buf);
#endif
***************
*** 7053,7058 ****
--- 7061,7067 ----
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,7095 ****
--- 7099,7105 ----
{
/* 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,7128 ****
if (!aborting())
#endif
EMSG2(_("E321: Could not reload \"%s\""), buf->b_fname);
! if (savebuf != NULL && buf_valid(savebuf) && buf == curbuf)
{
/* Put the text back from the save buffer. First
* delete any lines that readfile() added. */
--- 7132,7138 ----
if (!aborting())
#endif
EMSG2(_("E321: Could not reload \"%s\""), buf->b_fname);
! if (savebuf != NULL && bufref_valid(&bufref) && buf == curbuf)
{
/* Put the text back from the save buffer. First
* delete any lines that readfile() added. */
***************
*** 7150,7156 ****
}
vim_free(ea.cmd);
! if (savebuf != NULL && buf_valid(savebuf))
wipe_buffer(savebuf, FALSE);
#ifdef FEAT_DIFF
--- 7160,7166 ----
}
vim_free(ea.cmd);
! if (savebuf != NULL && bufref_valid(&bufref))
wipe_buffer(savebuf, FALSE);
#ifdef FEAT_DIFF
***************
*** 8739,8744 ****
--- 8749,8755 ----
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,8761 ****
--- 8767,8773 ----
{
/* 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,8778 ****
aucmd_restbuf(&aco);
/* stop if there is some error or buffer was deleted */
! if (retval == FAIL || !buf_valid(buf))
break;
}
}
--- 8784,8790 ----
aucmd_restbuf(&aco);
/* stop if there is some error or buffer was deleted */
! if (retval == FAIL || !bufref_valid(&bufref))
break;
}
}
***************
*** 8898,8904 ****
}
curbuf = buf;
aco->new_curwin = curwin;
! aco->new_curbuf = curbuf;
}
/*
--- 8910,8916 ----
}
curbuf = buf;
aco->new_curwin = curwin;
! set_bufref(&aco->new_curbuf, curbuf);
}
/*
***************
*** 8992,9007 ****
* 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)
{
# if defined(FEAT_SYN_HL) || defined(FEAT_SPELL)
if (curwin->w_s == &curbuf->b_s)
! curwin->w_s = &aco->new_curbuf->b_s;
# endif
--curbuf->b_nwindows;
! curbuf = aco->new_curbuf;
curwin->w_buffer = curbuf;
++curbuf->b_nwindows;
}
--- 9004,9019 ----
* it was changed, we are still the same window and the buffer is
* valid. */
if (curwin == aco->new_curwin
! && 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.br_buf->b_s;
# endif
--curbuf->b_nwindows;
! curbuf = aco->new_curbuf.br_buf;
curwin->w_buffer = curbuf;
++curbuf->b_nwindows;
}
***************
*** 9180,9185 ****
--- 9192,9201 ----
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,
*** ../vim-7.4.2023/src/main.c 2016-07-03 17:47:21.858812593 +0200
--- src/main.c 2016-07-10 21:37:07.453280320 +0200
***************
*** 1460,1468 ****
for (buf = firstbuf; buf != NULL; buf = buf->b_next)
if (buf->b_ml.ml_mfp != NULL)
{
apply_autocmds(EVENT_BUFUNLOAD, buf->b_fname, buf->b_fname,
FALSE, buf);
! if (!buf_valid(buf)) /* autocmd may delete the buffer */
break;
}
apply_autocmds(EVENT_VIMLEAVEPRE, NULL, NULL, FALSE, curbuf);
--- 1460,1472 ----
for (buf = firstbuf; buf != NULL; buf = buf->b_next)
if (buf->b_ml.ml_mfp != NULL)
{
+ bufref_T bufref;
+
+ set_bufref(&bufref, buf);
apply_autocmds(EVENT_BUFUNLOAD, buf->b_fname, buf->b_fname,
FALSE, buf);
! if (!bufref_valid(&bufref))
! /* autocmd deleted the buffer */
break;
}
apply_autocmds(EVENT_VIMLEAVEPRE, NULL, NULL, FALSE, curbuf);
*** ../vim-7.4.2023/src/misc2.c 2016-07-01 18:16:47.493936250 +0200
--- src/misc2.c 2016-07-10 21:37:43.108746863 +0200
***************
*** 1173,1181 ****
#endif
for (buf = firstbuf; buf != NULL; )
{
nextbuf = buf->b_next;
close_buffer(NULL, buf, DOBUF_WIPE, FALSE);
! if (buf_valid(buf))
buf = nextbuf; /* didn't work, try next one */
else
buf = firstbuf;
--- 1173,1184 ----
#endif
for (buf = firstbuf; buf != NULL; )
{
+ bufref_T bufref;
+
+ set_bufref(&bufref, buf);
nextbuf = buf->b_next;
close_buffer(NULL, buf, DOBUF_WIPE, FALSE);
! if (bufref_valid(&bufref))
buf = nextbuf; /* didn't work, try next one */
else
buf = firstbuf;
*** ../vim-7.4.2023/src/netbeans.c 2016-07-07 20:45:00.740424639 +0200
--- src/netbeans.c 2016-07-10 21:38:46.575797281 +0200
***************
*** 2177,2186 ****
#endif
)
{
buf_write_all(buf->bufp, FALSE);
#ifdef FEAT_AUTOCMD
/* an autocommand may have deleted the buffer */
! if (!buf_valid(buf->bufp))
buf->bufp = NULL;
#endif
}
--- 2177,2191 ----
#endif
)
{
+ #ifdef FEAT_AUTOCMD
+ bufref_T bufref;
+
+ set_bufref(&bufref, buf->bufp);
+ #endif
buf_write_all(buf->bufp, FALSE);
#ifdef FEAT_AUTOCMD
/* an autocommand may have deleted the buffer */
! if (!bufref_valid(&bufref))
buf->bufp = NULL;
#endif
}
*** ../vim-7.4.2023/src/quickfix.c 2016-07-10 20:27:27.423946553 +0200
--- src/quickfix.c 2016-07-10 21:42:25.596520113 +0200
***************
*** 4242,4248 ****
char_u *resulting_dir) /* out: new directory */
{
buf_T *newbuf;
! buf_T *newbuf_to_wipe = NULL;
int failed = TRUE;
aco_save_T aco;
--- 4242,4249 ----
char_u *resulting_dir) /* out: new directory */
{
buf_T *newbuf;
! bufref_T newbufref;
! bufref_T newbuf_to_wipe;
int failed = TRUE;
aco_save_T aco;
***************
*** 4250,4255 ****
--- 4251,4257 ----
newbuf = buflist_new(NULL, NULL, (linenr_T)1, BLN_DUMMY);
if (newbuf == NULL)
return NULL;
+ set_bufref(&newbufref, newbuf);
/* Init the options. */
buf_copy_options(newbuf, BCO_ENTER | BCO_NOHELP);
***************
*** 4270,4275 ****
--- 4272,4278 ----
* work. */
curbuf->b_flags &= ~BF_DUMMY;
+ newbuf_to_wipe.br_buf = NULL;
if (readfile(fname, NULL,
(linenr_T)0, (linenr_T)0, (linenr_T)MAXLNUM,
NULL, READ_NEW | READ_DUMMY) == OK
***************
*** 4283,4297 ****
* using netrw and editing a remote file. Use the current
* buffer instead, delete the dummy one after restoring the
* window stuff. */
! newbuf_to_wipe = newbuf;
newbuf = curbuf;
}
}
/* restore curwin/curbuf and a few other things */
aucmd_restbuf(&aco);
! if (newbuf_to_wipe != NULL && buf_valid(newbuf_to_wipe))
! wipe_buffer(newbuf_to_wipe, FALSE);
/* Add back the "dummy" flag, otherwise buflist_findname_stat() won't
* skip it. */
--- 4286,4300 ----
* using netrw and editing a remote file. Use the current
* buffer instead, delete the dummy one after restoring the
* window stuff. */
! set_bufref(&newbuf_to_wipe, newbuf);
newbuf = curbuf;
}
}
/* restore curwin/curbuf and a few other things */
aucmd_restbuf(&aco);
! if (newbuf_to_wipe.br_buf != NULL && bufref_valid(&newbuf_to_wipe))
! wipe_buffer(newbuf_to_wipe.br_buf, FALSE);
/* Add back the "dummy" flag, otherwise buflist_findname_stat() won't
* skip it. */
***************
*** 4306,4312 ****
mch_dirname(resulting_dir, MAXPATHL);
restore_start_dir(dirname_start);
! if (!buf_valid(newbuf))
return NULL;
if (failed)
{
--- 4309,4315 ----
mch_dirname(resulting_dir, MAXPATHL);
restore_start_dir(dirname_start);
! if (!bufref_valid(&newbufref))
return NULL;
if (failed)
{
*** ../vim-7.4.2023/src/spell.c 2016-07-01 17:17:13.294266702 +0200
--- src/spell.c 2016-07-10 21:46:01.041296134 +0200
***************
*** 4178,4183 ****
--- 4178,4188 ----
static int recursive = FALSE;
char_u *ret_msg = NULL;
char_u *spl_copy;
+ #ifdef FEAT_AUTOCMD
+ bufref_T bufref;
+
+ set_bufref(&bufref, wp->w_buffer);
+ #endif
/* We don't want to do this recursively. May happen when a language is
* not available and the SpellFileMissing autocommand opens a new buffer
***************
*** 4278,4284 ****
#ifdef FEAT_AUTOCMD
/* SpellFileMissing autocommands may do anything, including
* destroying the buffer we are using... */
! if (!buf_valid(wp->w_buffer))
{
ret_msg = (char_u *)"E797: SpellFileMissing autocommand
deleted buffer";
goto theend;
--- 4283,4289 ----
#ifdef FEAT_AUTOCMD
/* SpellFileMissing autocommands may do anything, including
* destroying the buffer we are using... */
! if (!bufref_valid(&bufref))
{
ret_msg = (char_u *)"E797: SpellFileMissing autocommand
deleted buffer";
goto theend;
***************
*** 15561,15567 ****
set_option_value((char_u*)"spl", dummy, spl, OPT_LOCAL);
vim_free(spl);
! if (!bufempty() || !buf_valid(curbuf))
return;
spell_dump_compl(NULL, 0, NULL, eap->forceit ? DUMPFLAG_COUNT : 0);
--- 15566,15572 ----
set_option_value((char_u*)"spl", dummy, spl, OPT_LOCAL);
vim_free(spl);
! if (!bufempty())
return;
spell_dump_compl(NULL, 0, NULL, eap->forceit ? DUMPFLAG_COUNT : 0);
*** ../vim-7.4.2023/src/term.c 2016-05-25 22:00:01.337797601 +0200
--- src/term.c 2016-07-10 21:46:51.560540103 +0200
***************
*** 1908,1928 ****
#ifdef FEAT_AUTOCMD
{
! buf_T *old_curbuf;
/*
* Execute the TermChanged autocommands for each buffer that is
* loaded.
*/
! old_curbuf = curbuf;
for (curbuf = firstbuf; curbuf != NULL; curbuf = curbuf->b_next)
{
if (curbuf->b_ml.ml_mfp != NULL)
apply_autocmds(EVENT_TERMCHANGED, NULL, NULL, FALSE,
curbuf);
}
! if (buf_valid(old_curbuf))
! curbuf = old_curbuf;
}
#endif
}
--- 1908,1928 ----
#ifdef FEAT_AUTOCMD
{
! bufref_T old_curbuf;
/*
* Execute the TermChanged autocommands for each buffer that is
* loaded.
*/
! set_bufref(&old_curbuf, curbuf);
for (curbuf = firstbuf; curbuf != NULL; curbuf = curbuf->b_next)
{
if (curbuf->b_ml.ml_mfp != NULL)
apply_autocmds(EVENT_TERMCHANGED, NULL, NULL, FALSE,
curbuf);
}
! if (bufref_valid(&old_curbuf))
! curbuf = old_curbuf.br_buf;
}
#endif
}
*** ../vim-7.4.2023/src/if_py_both.h 2016-06-01 20:38:29.377545387 +0200
--- src/if_py_both.h 2016-07-10 22:01:25.715489182 +0200
***************
*** 3409,3415 ****
{
win_T *save_curwin = NULL;
tabpage_T *save_curtab = NULL;
! buf_T *save_curbuf = NULL;
int set_ret = 0;
VimTryStart();
--- 3409,3415 ----
{
win_T *save_curwin = NULL;
tabpage_T *save_curtab = NULL;
! bufref_T save_curbuf;
int set_ret = 0;
VimTryStart();
***************
*** 3431,3437 ****
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);
break;
case SREQ_GLOBAL:
set_ret = set_option_value_err(key, numval, stringval, opt_flags);
--- 3431,3437 ----
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);
break;
case SREQ_GLOBAL:
set_ret = set_option_value_err(key, numval, stringval, opt_flags);
***************
*** 4273,4289 ****
buf_T *buf,
win_T **save_curwinp,
tabpage_T **save_curtabp,
! buf_T **save_curbufp)
{
win_T *wp;
tabpage_T *tp;
if (find_win_for_buf(buf, &wp, &tp) == FAIL)
! switch_buffer(save_curbufp, 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);
}
}
--- 4273,4289 ----
buf_T *buf,
win_T **save_curwinp,
tabpage_T **save_curtabp,
! bufref_T *save_curbuf)
{
win_T *wp;
tabpage_T *tp;
if (find_win_for_buf(buf, &wp, &tp) == FAIL)
! 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_curbuf, buf);
}
}
***************
*** 4291,4299 ****
restore_win_for_buf(
win_T *save_curwin,
tabpage_T *save_curtab,
! buf_T *save_curbuf)
{
! if (save_curbuf == NULL)
restore_win(save_curwin, save_curtab, TRUE);
else
restore_buffer(save_curbuf);
--- 4291,4299 ----
restore_win_for_buf(
win_T *save_curwin,
tabpage_T *save_curtab,
! bufref_T *save_curbuf)
{
! if (save_curbuf->br_buf == NULL)
restore_win(save_curwin, save_curtab, TRUE);
else
restore_buffer(save_curbuf);
***************
*** 4311,4317 ****
static int
SetBufferLine(buf_T *buf, PyInt n, PyObject *line, PyInt *len_change)
{
! buf_T *save_curbuf = NULL;
win_T *save_curwin = NULL;
tabpage_T *save_curtab = NULL;
--- 4311,4317 ----
static int
SetBufferLine(buf_T *buf, PyInt n, PyObject *line, PyInt *len_change)
{
! bufref_T save_curbuf = {NULL, 0};
win_T *save_curwin = NULL;
tabpage_T *save_curtab = NULL;
***************
*** 4336,4348 ****
{
if (buf == curbuf)
py_fix_cursor((linenr_T)n, (linenr_T)n + 1, (linenr_T)-1);
! if (save_curbuf == 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);
if (VimTryEnd())
return FAIL;
--- 4336,4348 ----
{
if (buf == curbuf)
py_fix_cursor((linenr_T)n, (linenr_T)n + 1, (linenr_T)-1);
! 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);
if (VimTryEnd())
return FAIL;
***************
*** 4378,4384 ****
else
changed_bytes((linenr_T)n, 0);
! 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)
--- 4378,4384 ----
else
changed_bytes((linenr_T)n, 0);
! 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,4421 ****
PyObject *list,
PyInt *len_change)
{
! buf_T *save_curbuf = NULL;
win_T *save_curwin = NULL;
tabpage_T *save_curtab = NULL;
--- 4415,4421 ----
PyObject *list,
PyInt *len_change)
{
! bufref_T save_curbuf = {NULL, 0};
win_T *save_curwin = NULL;
tabpage_T *save_curtab = NULL;
***************
*** 4446,4462 ****
break;
}
}
! if (buf == curbuf && (save_curwin != NULL || save_curbuf == NULL))
/* Using an existing window for the buffer, adjust the cursor
* position. */
py_fix_cursor((linenr_T)lo, (linenr_T)hi, (linenr_T)-n);
! if (save_curbuf == 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)lo, (long)i);
}
! restore_win_for_buf(save_curwin, save_curtab, save_curbuf);
if (VimTryEnd())
return FAIL;
--- 4446,4463 ----
break;
}
}
! if (buf == curbuf && (save_curwin != NULL
! || save_curbuf.br_buf == NULL))
/* Using an existing window for the buffer, adjust the cursor
* position. */
py_fix_cursor((linenr_T)lo, (linenr_T)hi, (linenr_T)-n);
! 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)lo, (long)i);
}
! restore_win_for_buf(save_curwin, save_curtab, &save_curbuf);
if (VimTryEnd())
return FAIL;
***************
*** 4578,4584 ****
* changed range, and move any in the remainder of the buffer.
* Only adjust marks if we managed to switch to a window that holds
* the buffer, otherwise line numbers will be invalid. */
! if (save_curbuf == NULL)
mark_adjust((linenr_T)lo, (linenr_T)(hi - 1),
(long)MAXLNUM, (long)extra);
changed_lines((linenr_T)lo, 0, (linenr_T)hi, (long)extra);
--- 4579,4585 ----
* changed range, and move any in the remainder of the buffer.
* Only adjust marks if we managed to switch to a window that holds
* the buffer, otherwise line numbers will be invalid. */
! if (save_curbuf.br_buf == NULL)
mark_adjust((linenr_T)lo, (linenr_T)(hi - 1),
(long)MAXLNUM, (long)extra);
changed_lines((linenr_T)lo, 0, (linenr_T)hi, (long)extra);
***************
*** 4587,4593 ****
py_fix_cursor((linenr_T)lo, (linenr_T)hi, (linenr_T)extra);
/* END of region without "return". */
! restore_win_for_buf(save_curwin, save_curtab, save_curbuf);
if (VimTryEnd())
return FAIL;
--- 4588,4594 ----
py_fix_cursor((linenr_T)lo, (linenr_T)hi, (linenr_T)extra);
/* END of region without "return". */
! restore_win_for_buf(save_curwin, save_curtab, &save_curbuf);
if (VimTryEnd())
return FAIL;
***************
*** 4615,4621 ****
static int
InsertBufferLines(buf_T *buf, PyInt n, PyObject *lines, PyInt *len_change)
{
! buf_T *save_curbuf = NULL;
win_T *save_curwin = NULL;
tabpage_T *save_curtab = NULL;
--- 4616,4622 ----
static int
InsertBufferLines(buf_T *buf, PyInt n, PyObject *lines, PyInt *len_change)
{
! bufref_T save_curbuf = {NULL, 0};
win_T *save_curwin = NULL;
tabpage_T *save_curtab = NULL;
***************
*** 4637,4649 ****
RAISE_UNDO_FAIL;
else if (ml_append((linenr_T)n, (char_u *)str, 0, FALSE) == FAIL)
RAISE_INSERT_LINE_FAIL;
! else if (save_curbuf == NULL)
/* Only adjust marks if we managed to switch to a window that
* holds the buffer, otherwise line numbers will be invalid. */
appended_lines_mark((linenr_T)n, 1L);
vim_free(str);
! restore_win_for_buf(save_curwin, save_curtab, save_curbuf);
update_screen(VALID);
if (VimTryEnd())
--- 4638,4650 ----
RAISE_UNDO_FAIL;
else if (ml_append((linenr_T)n, (char_u *)str, 0, FALSE) == FAIL)
RAISE_INSERT_LINE_FAIL;
! else 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. */
appended_lines_mark((linenr_T)n, 1L);
vim_free(str);
! restore_win_for_buf(save_curwin, save_curtab, &save_curbuf);
update_screen(VALID);
if (VimTryEnd())
***************
*** 4704,4710 ****
}
vim_free(array[i]);
}
! if (i > 0 && save_curbuf == NULL)
/* Only adjust marks if we managed to switch to a window that
* holds the buffer, otherwise line numbers will be invalid. */
appended_lines_mark((linenr_T)n, (long)i);
--- 4705,4711 ----
}
vim_free(array[i]);
}
! if (i > 0 && 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. */
appended_lines_mark((linenr_T)n, (long)i);
***************
*** 4713,4719 ****
/* Free the array of lines. All of its contents have now
* been freed. */
PyMem_Free(array);
! restore_win_for_buf(save_curwin, save_curtab, save_curbuf);
update_screen(VALID);
--- 4714,4720 ----
/* Free the array of lines. All of its contents have now
* been freed. */
PyMem_Free(array);
! restore_win_for_buf(save_curwin, save_curtab, &save_curbuf);
update_screen(VALID);
***************
*** 5216,5222 ****
pos_T *posp;
char_u *pmark;
char_u mark;
! buf_T *savebuf;
PyObject *todecref;
if (CheckBuffer(self))
--- 5217,5223 ----
pos_T *posp;
char_u *pmark;
char_u mark;
! bufref_T savebuf;
PyObject *todecref;
if (CheckBuffer(self))
***************
*** 5240,5246 ****
VimTryStart();
switch_buffer(&savebuf, self->buf);
posp = getmark(mark, FALSE);
! restore_buffer(savebuf);
if (VimTryEnd())
return NULL;
--- 5241,5247 ----
VimTryStart();
switch_buffer(&savebuf, self->buf);
posp = getmark(mark, FALSE);
! restore_buffer(&savebuf);
if (VimTryEnd())
return NULL;
*** ../vim-7.4.2023/src/window.c 2016-06-26 17:11:15.655124127 +0200
--- src/window.c 2016-07-10 21:54:33.633629346 +0200
***************
*** 2340,2345 ****
--- 2340,2348 ----
*/
if (win->w_buffer != NULL)
{
+ bufref_T bufref;
+
+ set_bufref(&bufref, curbuf);
#ifdef FEAT_AUTOCMD
win->w_closing = TRUE;
#endif
***************
*** 2350,2356 ****
#endif
/* Make sure curbuf is valid. It can become invalid if 'bufhidden' is
* "wipe". */
! if (!buf_valid(curbuf))
curbuf = firstbuf;
}
--- 2353,2359 ----
#endif
/* Make sure curbuf is valid. It can become invalid if 'bufhidden' is
* "wipe". */
! if (!bufref_valid(&bufref))
curbuf = firstbuf;
}
***************
*** 6632,6643 ****
* No autocommands will be executed. Use aucmd_prepbuf() if there are any.
*/
void
! switch_buffer(buf_T **save_curbuf, buf_T *buf)
{
# ifdef FEAT_AUTOCMD
block_autocmds();
# endif
! *save_curbuf = curbuf;
--curbuf->b_nwindows;
curbuf = buf;
curwin->w_buffer = buf;
--- 6635,6646 ----
* No autocommands will be executed. Use aucmd_prepbuf() if there are any.
*/
void
! switch_buffer(bufref_T *save_curbuf, buf_T *buf)
{
# ifdef FEAT_AUTOCMD
block_autocmds();
# endif
! set_bufref(save_curbuf, curbuf);
--curbuf->b_nwindows;
curbuf = buf;
curwin->w_buffer = buf;
***************
*** 6648,6664 ****
* Restore the current buffer after using switch_buffer().
*/
void
! restore_buffer(buf_T *save_curbuf)
{
# ifdef FEAT_AUTOCMD
unblock_autocmds();
# endif
/* Check for valid buffer, just in case. */
! if (buf_valid(save_curbuf))
{
--curbuf->b_nwindows;
! curwin->w_buffer = save_curbuf;
! curbuf = save_curbuf;
++curbuf->b_nwindows;
}
}
--- 6651,6667 ----
* Restore the current buffer after using switch_buffer().
*/
void
! restore_buffer(bufref_T *save_curbuf)
{
# ifdef FEAT_AUTOCMD
unblock_autocmds();
# endif
/* Check for valid buffer, just in case. */
! if (bufref_valid(save_curbuf))
{
--curbuf->b_nwindows;
! curwin->w_buffer = save_curbuf->br_buf;
! curbuf = save_curbuf->br_buf;
++curbuf->b_nwindows;
}
}
*** ../vim-7.4.2023/src/proto/buffer.pro 2016-07-10 18:21:45.728884145
+0200
--- src/proto/buffer.pro 2016-07-10 20:36:57.971371016 +0200
***************
*** 7,13 ****
void buf_clear_file(buf_T *buf);
void buf_freeall(buf_T *buf, int flags);
void goto_buffer(exarg_T *eap, int start, int dir, int count);
! void handle_swap_exists(buf_T *old_curbuf);
char_u *do_bufdel(int command, char_u *arg, int addr_count, int start_bnr,
int end_bnr, int forceit);
int do_buffer(int action, int start, int dir, int count, int forceit);
void set_curbuf(buf_T *buf, int action);
--- 7,13 ----
void buf_clear_file(buf_T *buf);
void buf_freeall(buf_T *buf, int flags);
void goto_buffer(exarg_T *eap, int start, int dir, int count);
! void handle_swap_exists(bufref_T *old_curbuf);
char_u *do_bufdel(int command, char_u *arg, int addr_count, int start_bnr,
int end_bnr, int forceit);
int do_buffer(int action, int start, int dir, int count, int forceit);
void set_curbuf(buf_T *buf, int action);
*** ../vim-7.4.2023/src/proto/window.pro 2016-03-13 19:04:45.381224860
+0100
--- src/proto/window.pro 2016-07-10 21:54:36.465587158 +0200
***************
*** 74,81 ****
void restore_snapshot(int idx, int close_curwin);
int switch_win(win_T **save_curwin, tabpage_T **save_curtab, win_T *win,
tabpage_T *tp, int no_display);
void restore_win(win_T *save_curwin, tabpage_T *save_curtab, int no_display);
! void switch_buffer(buf_T **save_curbuf, buf_T *buf);
! void restore_buffer(buf_T *save_curbuf);
int win_hasvertsplit(void);
int match_add(win_T *wp, char_u *grp, char_u *pat, int prio, int id, list_T
*pos_list, char_u *conceal_char);
int match_delete(win_T *wp, int id, int perr);
--- 74,81 ----
void restore_snapshot(int idx, int close_curwin);
int switch_win(win_T **save_curwin, tabpage_T **save_curtab, win_T *win,
tabpage_T *tp, int no_display);
void restore_win(win_T *save_curwin, tabpage_T *save_curtab, int no_display);
! void switch_buffer(bufref_T *save_curbuf, buf_T *buf);
! void restore_buffer(bufref_T *save_curbuf);
int win_hasvertsplit(void);
int match_add(win_T *wp, char_u *grp, char_u *pat, int prio, int id, list_T
*pos_list, char_u *conceal_char);
int match_delete(win_T *wp, int id, int perr);
*** ../vim-7.4.2023/src/version.c 2016-07-10 20:27:27.427946493 +0200
--- src/version.c 2016-07-10 22:02:19.370689525 +0200
***************
*** 760,761 ****
--- 760,763 ----
{ /* Add new patch number below this line */
+ /**/
+ 2024,
/**/
--
hundred-and-one symptoms of being an internet addict:
271. You collect hilarious signatures from all 250 mailing lists you
are subscribed to.
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.