Patch 8.0.0365
Problem: Might free a dict item that wasn't allocated.
Solution: Call dictitem_free(). (Nikolai Pavlov) Use this for
b:changedtick.
Files: src/dict.c, src/structs.h, src/buffer.c, src/edit.c,
src/evalfunc.c, src/ex_docmd.c, src/fileio.c, src/main.c,
src/memline.c, src/misc1.c, src/syntax.c
*** ../vim-8.0.0364/src/dict.c 2016-11-10 20:01:41.181582995 +0100
--- src/dict.c 2017-02-25 14:33:33.327756619 +0100
***************
*** 88,95 ****
* something recursive causing trouble. */
di = HI2DI(hi);
hash_remove(&d->dv_hashtab, hi);
! clear_tv(&di->di_tv);
! vim_free(di);
--todo;
}
}
--- 88,94 ----
* something recursive causing trouble. */
di = HI2DI(hi);
hash_remove(&d->dv_hashtab, hi);
! dictitem_free(di);
--todo;
}
}
*** ../vim-8.0.0364/src/structs.h 2017-02-17 16:31:16.909294226 +0100
--- src/structs.h 2017-02-25 14:39:55.349390887 +0100
***************
*** 1916,1924 ****
int b_changed; /* 'modified': Set to TRUE if something
in the
file has been changed and not written out. */
! varnumber_T *b_changedtick; /* points into b:changedtick or
b_ct_val;
incremented for each change, also for undo */
! varnumber_T b_ct_val; /* fallback for b:changedtick */
int b_saving; /* Set to TRUE if we are in the middle
of
saving the buffer. */
--- 1916,1925 ----
int b_changed; /* 'modified': Set to TRUE if something
in the
file has been changed and not written out. */
! dictitem16_T b_ct_di; /* holds the b:changedtick value in
! b_ct_di.di_tv.vval.v_number;
incremented for each change, also for undo */
! #define CHANGEDTICK(buf) ((buf)->b_ct_di.di_tv.vval.v_number)
int b_saving; /* Set to TRUE if we are in the middle
of
saving the buffer. */
*** ../vim-8.0.0364/src/buffer.c 2017-02-21 20:47:09.958394797 +0100
--- src/buffer.c 2017-02-25 14:50:32.457430069 +0100
***************
*** 832,838 ****
free_buffer_stuff(buf, TRUE);
#ifdef FEAT_EVAL
unref_var_dict(buf->b_vars);
- buf->b_changedtick = &buf->b_ct_val;
#endif
#ifdef FEAT_LUA
lua_buffer_free(buf);
--- 832,837 ----
***************
*** 874,904 ****
}
/*
! * Initializes buf->b_changedtick.
*/
static void
init_changedtick(buf_T *buf)
{
! #ifdef FEAT_EVAL
! dictitem_T *di = dictitem_alloc((char_u *)"changedtick");
! if (di != NULL)
! {
! di->di_flags |= DI_FLAGS_FIX | DI_FLAGS_RO;
! di->di_tv.v_type = VAR_NUMBER;
! di->di_tv.v_lock = VAR_FIXED;
! di->di_tv.vval.v_number = 0;
! if (dict_add(buf->b_vars, di) == OK)
! buf->b_changedtick = &di->di_tv.vval.v_number;
! else
! {
! vim_free(di);
! buf->b_changedtick = &buf->b_ct_val;
! }
! }
! else
! #endif
! buf->b_changedtick = &buf->b_ct_val;
}
/*
--- 873,892 ----
}
/*
! * Initializes b:changedtick.
*/
static void
init_changedtick(buf_T *buf)
{
! dictitem_T *di = (dictitem_T *)&buf->b_ct_di;
! di->di_flags = DI_FLAGS_FIX | DI_FLAGS_RO;
! di->di_tv.v_type = VAR_NUMBER;
! di->di_tv.v_lock = VAR_FIXED;
! di->di_tv.vval.v_number = 0;
!
! STRCPY(buf->b_ct_di.di_key, "changedtick");
! (void)dict_add(buf->b_vars, di);
}
/*
***************
*** 919,930 ****
}
#ifdef FEAT_EVAL
{
! varnumber_T tick = *buf->b_changedtick;
vars_clear(&buf->b_vars->dv_hashtab); /* free all buffer variables */
hash_init(&buf->b_vars->dv_hashtab);
init_changedtick(buf);
! *buf->b_changedtick = tick;
}
#endif
#ifdef FEAT_USR_CMDS
--- 907,918 ----
}
#ifdef FEAT_EVAL
{
! varnumber_T tick = CHANGEDTICK(buf);
vars_clear(&buf->b_vars->dv_hashtab); /* free all buffer variables */
hash_init(&buf->b_vars->dv_hashtab);
init_changedtick(buf);
! CHANGEDTICK(buf) = tick;
}
#endif
#ifdef FEAT_USR_CMDS
*** ../vim-8.0.0364/src/edit.c 2017-02-23 18:08:51.324806489 +0100
--- src/edit.c 2017-02-25 14:44:35.111655103 +0100
***************
*** 1668,1674 ****
#ifdef FEAT_AUTOCMD
/* Trigger TextChangedI if b_changedtick differs. */
if (ready && has_textchangedI()
! && last_changedtick != *curbuf->b_changedtick
# ifdef FEAT_INS_EXPAND
&& !pum_visible()
# endif
--- 1668,1674 ----
#ifdef FEAT_AUTOCMD
/* Trigger TextChangedI if b_changedtick differs. */
if (ready && has_textchangedI()
! && last_changedtick != CHANGEDTICK(curbuf)
# ifdef FEAT_INS_EXPAND
&& !pum_visible()
# endif
***************
*** 1677,1683 ****
if (last_changedtick_buf == curbuf)
apply_autocmds(EVENT_TEXTCHANGEDI, NULL, NULL, FALSE, curbuf);
last_changedtick_buf = curbuf;
! last_changedtick = *curbuf->b_changedtick;
}
#endif
--- 1677,1683 ----
if (last_changedtick_buf == curbuf)
apply_autocmds(EVENT_TEXTCHANGEDI, NULL, NULL, FALSE, curbuf);
last_changedtick_buf = curbuf;
! last_changedtick = CHANGEDTICK(curbuf);
}
#endif
*** ../vim-8.0.0364/src/evalfunc.c 2017-02-21 20:47:09.966394747 +0100
--- src/evalfunc.c 2017-02-25 14:45:27.639327794 +0100
***************
*** 2550,2556 ****
if (lnum < 0) /* ignore type error in {lnum} arg */
lnum = 0;
if (lnum != prev_lnum
! || changedtick != *curbuf->b_changedtick
|| fnum != curbuf->b_fnum)
{
/* New line, buffer, change: need to get the values. */
--- 2550,2556 ----
if (lnum < 0) /* ignore type error in {lnum} arg */
lnum = 0;
if (lnum != prev_lnum
! || changedtick != CHANGEDTICK(curbuf)
|| fnum != curbuf->b_fnum)
{
/* New line, buffer, change: need to get the values. */
***************
*** 2572,2578 ****
else
hlID = (hlf_T)0;
prev_lnum = lnum;
! changedtick = *curbuf->b_changedtick;
fnum = curbuf->b_fnum;
}
--- 2572,2578 ----
else
hlID = (hlf_T)0;
prev_lnum = lnum;
! changedtick = CHANGEDTICK(curbuf);
fnum = curbuf->b_fnum;
}
***************
*** 3957,3963 ****
dict_add_nr_str(dict, "loaded", buf->b_ml.ml_mfp != NULL, NULL);
dict_add_nr_str(dict, "listed", buf->b_p_bl, NULL);
dict_add_nr_str(dict, "changed", bufIsChanged(buf), NULL);
! dict_add_nr_str(dict, "changedtick", *buf->b_changedtick, NULL);
dict_add_nr_str(dict, "hidden",
buf->b_ml.ml_mfp != NULL && buf->b_nwindows == 0,
NULL);
--- 3957,3963 ----
dict_add_nr_str(dict, "loaded", buf->b_ml.ml_mfp != NULL, NULL);
dict_add_nr_str(dict, "listed", buf->b_p_bl, NULL);
dict_add_nr_str(dict, "changed", bufIsChanged(buf), NULL);
! dict_add_nr_str(dict, "changedtick", CHANGEDTICK(buf), NULL);
dict_add_nr_str(dict, "hidden",
buf->b_ml.ml_mfp != NULL && buf->b_nwindows == 0,
NULL);
*** ../vim-8.0.0364/src/ex_docmd.c 2017-02-17 16:31:16.921294136 +0100
--- src/ex_docmd.c 2017-02-25 14:45:58.859133297 +0100
***************
*** 660,666 ****
need_wait_return = FALSE;
ex_pressedreturn = FALSE;
ex_no_reprint = FALSE;
! changedtick = *curbuf->b_changedtick;
prev_msg_row = msg_row;
prev_line = curwin->w_cursor.lnum;
if (improved)
--- 660,666 ----
need_wait_return = FALSE;
ex_pressedreturn = FALSE;
ex_no_reprint = FALSE;
! changedtick = CHANGEDTICK(curbuf);
prev_msg_row = msg_row;
prev_line = curwin->w_cursor.lnum;
if (improved)
***************
*** 673,679 ****
lines_left = Rows - 1;
if ((prev_line != curwin->w_cursor.lnum
! || changedtick != *curbuf->b_changedtick) && !ex_no_reprint)
{
if (curbuf->b_ml.ml_flags & ML_EMPTY)
EMSG(_(e_emptybuf));
--- 673,679 ----
lines_left = Rows - 1;
if ((prev_line != curwin->w_cursor.lnum
! || changedtick != CHANGEDTICK(curbuf)) && !ex_no_reprint)
{
if (curbuf->b_ml.ml_flags & ML_EMPTY)
EMSG(_(e_emptybuf));
*** ../vim-8.0.0364/src/fileio.c 2017-02-17 16:31:16.925294107 +0100
--- src/fileio.c 2017-02-25 14:46:43.194857144 +0100
***************
*** 4924,4934 ****
{
unchanged(buf, TRUE);
#ifdef FEAT_AUTOCMD
! /* buf->b_changedtick is always incremented in unchanged() but that
* should not trigger a TextChanged event. */
! if (last_changedtick + 1 == *buf->b_changedtick
&& last_changedtick_buf == buf)
! last_changedtick = *buf->b_changedtick;
#endif
u_unchanged(buf);
u_update_save_nr(buf);
--- 4924,4934 ----
{
unchanged(buf, TRUE);
#ifdef FEAT_AUTOCMD
! /* b:changedtick is always incremented in unchanged() but that
* should not trigger a TextChanged event. */
! if (last_changedtick + 1 == CHANGEDTICK(buf)
&& last_changedtick_buf == buf)
! last_changedtick = CHANGEDTICK(buf);
#endif
u_unchanged(buf);
u_update_save_nr(buf);
*** ../vim-8.0.0364/src/main.c 2017-02-17 16:31:16.921294136 +0100
--- src/main.c 2017-02-25 14:52:12.920805203 +0100
***************
*** 1162,1176 ****
#endif
#ifdef FEAT_AUTOCMD
! /* Trigger TextChanged if b_changedtick differs. */
if (!finish_op && has_textchanged()
! && last_changedtick != *curbuf->b_changedtick)
{
if (last_changedtick_buf == curbuf)
apply_autocmds(EVENT_TEXTCHANGED, NULL, NULL,
FALSE, curbuf);
last_changedtick_buf = curbuf;
! last_changedtick = *curbuf->b_changedtick;
}
#endif
--- 1162,1176 ----
#endif
#ifdef FEAT_AUTOCMD
! /* Trigger TextChanged if b:changedtick differs. */
if (!finish_op && has_textchanged()
! && last_changedtick != CHANGEDTICK(curbuf))
{
if (last_changedtick_buf == curbuf)
apply_autocmds(EVENT_TEXTCHANGED, NULL, NULL,
FALSE, curbuf);
last_changedtick_buf = curbuf;
! last_changedtick = CHANGEDTICK(curbuf);
}
#endif
***************
*** 1388,1398 ****
/* Autocmd must have close the buffer already, skip. */
continue;
buf = wp->w_buffer;
! if (buf->b_ct_val != -1)
{
apply_autocmds(EVENT_BUFWINLEAVE, buf->b_fname,
buf->b_fname, FALSE, buf);
! buf->b_ct_val = -1; /* note that we did it already */
/* start all over, autocommands may mess up the lists */
next_tp = first_tabpage;
break;
--- 1388,1398 ----
/* Autocmd must have close the buffer already, skip. */
continue;
buf = wp->w_buffer;
! if (CHANGEDTICK(buf) != -1)
{
apply_autocmds(EVENT_BUFWINLEAVE, buf->b_fname,
buf->b_fname, FALSE, buf);
! CHANGEDTICK(buf) = -1; /* note that we did it already */
/* start all over, autocommands may mess up the lists */
next_tp = first_tabpage;
break;
*** ../vim-8.0.0364/src/memline.c 2017-02-18 16:58:44.264503901 +0100
--- src/memline.c 2017-02-25 14:48:03.078359721 +0100
***************
*** 1649,1655 ****
if (!(curbuf->b_ml.ml_line_count == 2 && *ml_get(1) == NUL))
{
changed_int();
! ++*curbuf->b_changedtick;
}
}
else
--- 1649,1655 ----
if (!(curbuf->b_ml.ml_line_count == 2 && *ml_get(1) == NUL))
{
changed_int();
! ++CHANGEDTICK(curbuf);
}
}
else
***************
*** 1663,1669 ****
if (i != 0)
{
changed_int();
! ++*curbuf->b_changedtick;
break;
}
}
--- 1663,1669 ----
if (i != 0)
{
changed_int();
! ++CHANGEDTICK(curbuf);
break;
}
}
*** ../vim-8.0.0364/src/misc1.c 2017-02-23 17:07:10.308599718 +0100
--- src/misc1.c 2017-02-25 14:49:15.509908867 +0100
***************
*** 502,512 ****
/* used cached indent, unless pointer or 'tabstop' changed */
if (prev_line != line || prev_ts != wp->w_buffer->b_p_ts
! || prev_tick != *wp->w_buffer->b_changedtick)
{
prev_line = line;
prev_ts = wp->w_buffer->b_p_ts;
! prev_tick = *wp->w_buffer->b_changedtick;
prev_indent = get_indent_str(line,
(int)wp->w_buffer->b_p_ts, wp->w_p_list);
}
--- 502,512 ----
/* used cached indent, unless pointer or 'tabstop' changed */
if (prev_line != line || prev_ts != wp->w_buffer->b_p_ts
! || prev_tick != CHANGEDTICK(wp->w_buffer))
{
prev_line = line;
prev_ts = wp->w_buffer->b_p_ts;
! prev_tick = CHANGEDTICK(wp->w_buffer);
prev_indent = get_indent_str(line,
(int)wp->w_buffer->b_p_ts, wp->w_p_list);
}
***************
*** 2768,2774 ****
}
changed_int();
}
! ++*curbuf->b_changedtick;
}
/*
--- 2768,2774 ----
}
changed_int();
}
! ++CHANGEDTICK(curbuf);
}
/*
***************
*** 3195,3201 ****
need_maketitle = TRUE; /* set window title later */
#endif
}
! ++*buf->b_changedtick;
#ifdef FEAT_NETBEANS_INTG
netbeans_unmodified(buf);
#endif
--- 3195,3201 ----
need_maketitle = TRUE; /* set window title later */
#endif
}
! ++CHANGEDTICK(buf);
#ifdef FEAT_NETBEANS_INTG
netbeans_unmodified(buf);
#endif
*** ../vim-8.0.0364/src/syntax.c 2017-02-17 16:31:16.929294079 +0100
--- src/syntax.c 2017-02-25 14:49:57.257649075 +0100
***************
*** 516,528 ****
*/
if (syn_block != wp->w_s
|| syn_buf != wp->w_buffer
! || changedtick != *syn_buf->b_changedtick)
{
invalidate_current_state();
syn_buf = wp->w_buffer;
syn_block = wp->w_s;
}
! changedtick = *syn_buf->b_changedtick;
syn_win = wp;
/*
--- 516,528 ----
*/
if (syn_block != wp->w_s
|| syn_buf != wp->w_buffer
! || changedtick != CHANGEDTICK(syn_buf))
{
invalidate_current_state();
syn_buf = wp->w_buffer;
syn_block = wp->w_s;
}
! changedtick = CHANGEDTICK(syn_buf);
syn_win = wp;
/*
*** ../vim-8.0.0364/src/version.c 2017-02-25 14:20:56.784372170 +0100
--- src/version.c 2017-02-25 14:56:48.031095489 +0100
***************
*** 766,767 ****
--- 766,769 ----
{ /* Add new patch number below this line */
+ /**/
+ 365,
/**/
--
hundred-and-one symptoms of being an internet addict:
22. You've already visited all the links at Yahoo and you're halfway through
Lycos.
/// 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.