diff options
author | ZyX <kp-pav@yandex.ru> | 2018-06-22 00:44:31 +0300 |
---|---|---|
committer | ZyX <kp-pav@yandex.ru> | 2018-06-22 00:44:31 +0300 |
commit | eaf2a25f12342622414b264870f41939fe41355a (patch) | |
tree | e2378deecf6863a10c19a4a36480d2ffa1716b5a /src | |
parent | cf659a19260aea27816575d67a12139ebaada56f (diff) | |
download | rneovim-eaf2a25f12342622414b264870f41939fe41355a.tar.gz rneovim-eaf2a25f12342622414b264870f41939fe41355a.tar.bz2 rneovim-eaf2a25f12342622414b264870f41939fe41355a.zip |
*: Replace b_changedtick with new always-inline functions
Ref #8474
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/api/buffer.c | 2 | ||||
-rw-r--r-- | src/nvim/buffer.c | 2 | ||||
-rw-r--r-- | src/nvim/buffer.h | 33 | ||||
-rw-r--r-- | src/nvim/buffer_defs.h | 12 | ||||
-rw-r--r-- | src/nvim/buffer_updates.c | 7 | ||||
-rw-r--r-- | src/nvim/edit.c | 12 | ||||
-rw-r--r-- | src/nvim/eval.c | 6 | ||||
-rw-r--r-- | src/nvim/ex_cmds.c | 4 | ||||
-rw-r--r-- | src/nvim/ex_docmd.c | 16 | ||||
-rw-r--r-- | src/nvim/fileio.c | 12 | ||||
-rw-r--r-- | src/nvim/indent.c | 20 | ||||
-rw-r--r-- | src/nvim/main.c | 2 | ||||
-rw-r--r-- | src/nvim/memline.c | 4 | ||||
-rw-r--r-- | src/nvim/misc1.c | 8 | ||||
-rw-r--r-- | src/nvim/normal.c | 6 | ||||
-rw-r--r-- | src/nvim/syntax.c | 5 | ||||
-rw-r--r-- | src/nvim/undo.c | 2 |
17 files changed, 93 insertions, 60 deletions
diff --git a/src/nvim/api/buffer.c b/src/nvim/api/buffer.c index e1fe7617ff..b5dd72c513 100644 --- a/src/nvim/api/buffer.c +++ b/src/nvim/api/buffer.c @@ -496,7 +496,7 @@ Integer nvim_buf_get_changedtick(Buffer buffer, Error *err) return -1; } - return buf->b_changedtick; + return buf_get_changedtick(buf); } /// Gets a list of buffer-local |mapping| definitions. diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c index ea2ae016b9..ae535354f8 100644 --- a/src/nvim/buffer.c +++ b/src/nvim/buffer.c @@ -1555,7 +1555,7 @@ static inline void buf_init_changedtick(buf_T *const buf) .di_tv = (typval_T) { .v_type = VAR_NUMBER, .v_lock = VAR_FIXED, - .vval.v_number = buf->b_changedtick, + .vval.v_number = buf_get_changedtick(buf), }, .di_key = "changedtick", }; diff --git a/src/nvim/buffer.h b/src/nvim/buffer.h index d12862a0c6..e61c312fb1 100644 --- a/src/nvim/buffer.h +++ b/src/nvim/buffer.h @@ -96,7 +96,7 @@ static inline void buf_set_changedtick(buf_T *const buf, const varnumber_T changedtick) REAL_FATTR_NONNULL_ALL REAL_FATTR_ALWAYS_INLINE; -/// Set b_changedtick and corresponding variable +/// Set b:changedtick, also checking b: for consistency in debug build /// /// @param[out] buf Buffer to set changedtick in. /// @param[in] changedtick New value. @@ -114,10 +114,35 @@ static inline void buf_set_changedtick(buf_T *const buf, assert(changedtick_di->di_flags == (DI_FLAGS_RO|DI_FLAGS_FIX)); # endif assert(changedtick_di == (dictitem_T *)&buf->changedtick_di); - assert(&buf->b_changedtick // -V501 - == &buf->changedtick_di.di_tv.vval.v_number); #endif - buf->b_changedtick = changedtick; + buf->changedtick_di.di_tv.vval.v_number = changedtick; +} + +static inline varnumber_T buf_get_changedtick(const buf_T *const buf) + REAL_FATTR_NONNULL_ALL REAL_FATTR_ALWAYS_INLINE REAL_FATTR_PURE + REAL_FATTR_WARN_UNUSED_RESULT; + +/// Get b:changedtick value +/// +/// Faster then querying b:. +/// +/// @param[in] buf Buffer to get b:changedtick from. +static inline varnumber_T buf_get_changedtick(const buf_T *const buf) +{ + return buf->changedtick_di.di_tv.vval.v_number; +} + +static inline void buf_inc_changedtick(buf_T *const buf) + REAL_FATTR_NONNULL_ALL REAL_FATTR_ALWAYS_INLINE; + +/// Increment b:changedtick value +/// +/// Also checks b: for consistency in case of debug build. +/// +/// @param[in,out] buf Buffer to increment value in. +static inline void buf_inc_changedtick(buf_T *const buf) +{ + buf_set_changedtick(buf, buf_get_changedtick(buf) + 1); } #define WITH_BUFFER(b, code) \ diff --git a/src/nvim/buffer_defs.h b/src/nvim/buffer_defs.h index 4fce4ecd22..97e443547c 100644 --- a/src/nvim/buffer_defs.h +++ b/src/nvim/buffer_defs.h @@ -483,9 +483,11 @@ struct file_buffer { int b_changed; // 'modified': Set to true if something in the // file has been changed and not written out. -/// Change identifier incremented for each change, including undo -#define b_changedtick changedtick_di.di_tv.vval.v_number - ChangedtickDictItem changedtick_di; // b:changedtick dictionary item. + + /// Change identifier incremented for each change, including undo + /// + /// This is a dictionary item used to store in b:changedtick. + ChangedtickDictItem changedtick_di; varnumber_T b_last_changedtick; // b:changedtick when TextChanged or // TextChangedI was last triggered. @@ -1195,4 +1197,8 @@ static inline int win_hl_attr(win_T *wp, int hlf) return wp->w_hl_attrs[hlf]; } +/// Macros defined in Vim, but not in Neovim +#define CHANGEDTICK(buf) \ + (=== Include buffer.h & use buf_(get|set|inc)_changedtick ===) + #endif // NVIM_BUFFER_DEFS_H diff --git a/src/nvim/buffer_updates.c b/src/nvim/buffer_updates.c index c1b2828666..18b53a0685 100644 --- a/src/nvim/buffer_updates.c +++ b/src/nvim/buffer_updates.c @@ -6,6 +6,7 @@ #include "nvim/api/private/helpers.h" #include "nvim/msgpack_rpc/channel.h" #include "nvim/assert.h" +#include "nvim/buffer.h" // Register a channel. Return True if the channel was added, or already added. // Return False if the channel couldn't be added because the buffer is @@ -38,7 +39,7 @@ bool buf_updates_register(buf_T *buf, uint64_t channel_id, bool send_buffer) // the first argument is always the buffer handle args.items[0] = BUFFER_OBJ(buf->handle); - args.items[1] = INTEGER_OBJ(buf->b_changedtick); + args.items[1] = INTEGER_OBJ(buf_get_changedtick(buf)); // the first line that changed (zero-indexed) args.items[2] = INTEGER_OBJ(0); // the last line that was changed @@ -148,7 +149,7 @@ void buf_updates_send_changes(buf_T *buf, args.items[0] = BUFFER_OBJ(buf->handle); // next argument is b:changedtick - args.items[1] = send_tick ? INTEGER_OBJ(buf->b_changedtick) : NIL; + args.items[1] = send_tick ? INTEGER_OBJ(buf_get_changedtick(buf)) : NIL; // the first line that changed (zero-indexed) args.items[2] = INTEGER_OBJ(firstline - 1); @@ -203,7 +204,7 @@ void buf_updates_changedtick_single(buf_T *buf, uint64_t channel_id) args.items[0] = BUFFER_OBJ(buf->handle); // next argument is b:changedtick - args.items[1] = INTEGER_OBJ(buf->b_changedtick); + args.items[1] = INTEGER_OBJ(buf_get_changedtick(buf)); // don't try and clean up dead channels here rpc_send_event(channel_id, "nvim_buf_changedtick_event", args); diff --git a/src/nvim/edit.c b/src/nvim/edit.c index d4075fc197..bf80f12bd0 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -1386,22 +1386,22 @@ ins_redraw ( last_cursormoved = curwin->w_cursor; } - // Trigger TextChangedI if b_changedtick differs. + // Trigger TextChangedI if changedtick differs. if (ready && has_event(EVENT_TEXTCHANGEDI) - && curbuf->b_last_changedtick != curbuf->b_changedtick + && curbuf->b_last_changedtick != buf_get_changedtick(curbuf) && !pum_visible()) { apply_autocmds(EVENT_TEXTCHANGEDI, NULL, NULL, false, curbuf); - curbuf->b_last_changedtick = curbuf->b_changedtick; + curbuf->b_last_changedtick = buf_get_changedtick(curbuf); } - // Trigger TextChangedP if b_changedtick differs. When the popupmenu closes + // Trigger TextChangedP if changedtick differs. When the popupmenu closes // TextChangedI will need to trigger for backwards compatibility, thus use // different b_last_changedtick* variables. if (ready && has_event(EVENT_TEXTCHANGEDP) - && curbuf->b_last_changedtick_pum != curbuf->b_changedtick + && curbuf->b_last_changedtick_pum != buf_get_changedtick(curbuf) && pum_visible()) { apply_autocmds(EVENT_TEXTCHANGEDP, NULL, NULL, false, curbuf); - curbuf->b_last_changedtick_pum = curbuf->b_changedtick; + curbuf->b_last_changedtick_pum = buf_get_changedtick(curbuf); } if (must_redraw) diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 5505f5f102..b517169e08 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -7906,7 +7906,7 @@ static void f_diff_hlID(typval_T *argvars, typval_T *rettv, FunPtr fptr) if (lnum < 0) /* ignore type error in {lnum} arg */ lnum = 0; if (lnum != prev_lnum - || changedtick != curbuf->b_changedtick + || changedtick != buf_get_changedtick(curbuf) || fnum != curbuf->b_fnum) { /* New line, buffer, change: need to get the values. */ filler_lines = diff_check(curwin, lnum); @@ -7923,7 +7923,7 @@ static void f_diff_hlID(typval_T *argvars, typval_T *rettv, FunPtr fptr) } else hlID = (hlf_T)0; prev_lnum = lnum; - changedtick = curbuf->b_changedtick; + changedtick = buf_get_changedtick(curbuf); fnum = curbuf->b_fnum; } @@ -9172,7 +9172,7 @@ static dict_T *get_buffer_info(buf_T *buf) tv_dict_add_nr(dict, S_LEN("loaded"), buf->b_ml.ml_mfp != NULL); tv_dict_add_nr(dict, S_LEN("listed"), buf->b_p_bl); tv_dict_add_nr(dict, S_LEN("changed"), bufIsChanged(buf)); - tv_dict_add_nr(dict, S_LEN("changedtick"), buf->b_changedtick); + tv_dict_add_nr(dict, S_LEN("changedtick"), buf_get_changedtick(buf)); tv_dict_add_nr(dict, S_LEN("hidden"), buf->b_ml.ml_mfp != NULL && buf->b_nwindows == 0); diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c index d8aac73b57..dbf11514cf 100644 --- a/src/nvim/ex_cmds.c +++ b/src/nvim/ex_cmds.c @@ -6293,7 +6293,7 @@ void ex_substitute(exarg_T *eap) garray_T save_view; win_size_save(&save_view); // Save current window sizes. save_search_patterns(); - int save_changedtick = curbuf->b_changedtick; + int save_changedtick = buf_get_changedtick(curbuf); time_t save_b_u_time_cur = curbuf->b_u_time_cur; u_header_T *save_b_u_newhead = curbuf->b_u_newhead; long save_b_p_ul = curbuf->b_p_ul; @@ -6310,7 +6310,7 @@ void ex_substitute(exarg_T *eap) buf_T *preview_buf = do_sub(eap, profile_setlimit(p_rdt), false); p_hls = save_hls; - if (save_changedtick != curbuf->b_changedtick) { + if (save_changedtick != buf_get_changedtick(curbuf)) { // Undo invisibly. This also moves the cursor! if (!u_undo_and_forget(1)) { abort(); } // Restore newhead. It is meaningless when curhead is valid, but we must diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index f0e4883fdd..c1b9eff697 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -218,11 +218,11 @@ void do_exmode(int improved) exmode_active = FALSE; break; } - msg_scroll = TRUE; - need_wait_return = FALSE; - ex_pressedreturn = FALSE; - ex_no_reprint = FALSE; - changedtick = curbuf->b_changedtick; + msg_scroll = true; + need_wait_return = false; + ex_pressedreturn = false; + ex_no_reprint = false; + changedtick = buf_get_changedtick(curbuf); prev_msg_row = msg_row; prev_line = curwin->w_cursor.lnum; cmdline_row = msg_row; @@ -230,10 +230,10 @@ void do_exmode(int improved) 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) + || changedtick != buf_get_changedtick(curbuf)) && !ex_no_reprint) { + if (curbuf->b_ml.ml_flags & ML_EMPTY) { EMSG(_(e_emptybuf)); - else { + } else { if (ex_pressedreturn) { /* go up one line, to overwrite the ":<CR>" line, so the * output doesn't contain empty lines. */ diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c index 3b6a3a7995..53878e4652 100644 --- a/src/nvim/fileio.c +++ b/src/nvim/fileio.c @@ -3566,13 +3566,11 @@ restore_backup: * writing to the original file and '+' is not in 'cpoptions'. */ if (reset_changed && whole && !append && !write_info.bw_conv_error - && (overwriting || vim_strchr(p_cpo, CPO_PLUS) != NULL) - ) { - unchanged(buf, TRUE); - /* buf->b_changedtick is always incremented in unchanged() but that - * should not trigger a TextChanged event. */ - if (buf->b_last_changedtick + 1 == buf->b_changedtick) { - buf->b_last_changedtick = buf->b_changedtick; + && (overwriting || vim_strchr(p_cpo, CPO_PLUS) != NULL)) { + unchanged(buf, true); + const varnumber_T changedtick = buf_get_changedtick(buf); + if (buf->b_last_changedtick + 1 == changedtick) { + buf->b_last_changedtick = changedtick; } u_unchanged(buf); u_update_save_nr(buf); diff --git a/src/nvim/indent.c b/src/nvim/indent.c index c94186a1f2..3cc64e0033 100644 --- a/src/nvim/indent.c +++ b/src/nvim/indent.c @@ -21,6 +21,7 @@ #include "nvim/search.h" #include "nvim/strings.h" #include "nvim/undo.h" +#include "nvim/buffer.h" #ifdef INCLUDE_GENERATED_DECLARATIONS @@ -454,11 +455,13 @@ int get_number_indent(linenr_T lnum) * parameters into account. Window must be specified, since it is not * necessarily always the current one. */ -int get_breakindent_win(win_T *wp, char_u *line) { - static int prev_indent = 0; /* cached indent value */ - static long prev_ts = 0; /* cached tabstop value */ - static char_u *prev_line = NULL; /* cached pointer to line */ - static int prev_tick = 0; // changedtick of cached value +int get_breakindent_win(win_T *wp, char_u *line) + FUNC_ATTR_NONNULL_ARG(1) +{ + static int prev_indent = 0; // Cached indent value. + static long prev_ts = 0; // Cached tabstop value. + static char_u *prev_line = NULL; // cached pointer to line. + static varnumber_T prev_tick = 0; // Changedtick of cached value. int bri = 0; /* window width minus window margin space, i.e. what rests for text */ const int eff_wwidth = wp->w_width @@ -468,12 +471,11 @@ int get_breakindent_win(win_T *wp, char_u *line) { /* 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_tick != buf_get_changedtick(wp->w_buffer)) { prev_line = line; prev_ts = wp->w_buffer->b_p_ts; - prev_tick = (int)wp->w_buffer->b_changedtick; - prev_indent = get_indent_str(line, - (int)wp->w_buffer->b_p_ts, wp->w_p_list); + prev_tick = buf_get_changedtick(wp->w_buffer); + prev_indent = get_indent_str(line, (int)wp->w_buffer->b_p_ts, wp->w_p_list); } bri = prev_indent + wp->w_p_brishift; diff --git a/src/nvim/main.c b/src/nvim/main.c index 6aed84aba5..ac740eb1f1 100644 --- a/src/nvim/main.c +++ b/src/nvim/main.c @@ -603,7 +603,7 @@ void getout(int exitval) } buf_T *buf = wp->w_buffer; - if (buf->b_changedtick != -1) { + if (buf_get_changedtick(buf) != -1) { apply_autocmds(EVENT_BUFWINLEAVE, buf->b_fname, buf->b_fname, false, buf); buf_set_changedtick(buf, -1); // note that we did it already diff --git a/src/nvim/memline.c b/src/nvim/memline.c index b156f2c513..fc9a1e8271 100644 --- a/src/nvim/memline.c +++ b/src/nvim/memline.c @@ -1171,7 +1171,7 @@ void ml_recover(void) * empty. Don't set the modified flag then. */ if (!(curbuf->b_ml.ml_line_count == 2 && *ml_get(1) == NUL)) { changed_int(); - buf_set_changedtick(curbuf, curbuf->b_changedtick + 1); + buf_inc_changedtick(curbuf); } } else { for (idx = 1; idx <= lnum; ++idx) { @@ -1181,7 +1181,7 @@ void ml_recover(void) xfree(p); if (i != 0) { changed_int(); - buf_set_changedtick(curbuf, curbuf->b_changedtick + 1); + buf_inc_changedtick(curbuf); break; } } diff --git a/src/nvim/misc1.c b/src/nvim/misc1.c index 5678360ef0..3d7399f151 100644 --- a/src/nvim/misc1.c +++ b/src/nvim/misc1.c @@ -1795,7 +1795,7 @@ void changed(void) } changed_int(); } - buf_set_changedtick(curbuf, curbuf->b_changedtick + 1); + buf_inc_changedtick(curbuf); } /* @@ -1922,9 +1922,9 @@ changed_lines( linenr_T lnume, // line below last changed line long xtra, // number of extra lines (negative when deleting) bool do_buf_event // some callers like undo/redo call changed_lines() - // and then increment b_changedtick *again*. This flag + // and then increment changedtick *again*. This flag // allows these callers to send the nvim_buf_lines_event - // events after they're done modifying b_changedtick. + // events after they're done modifying changedtick. ) { changed_lines_buf(curbuf, lnum, lnume, xtra); @@ -2168,7 +2168,7 @@ unchanged ( redraw_tabline = TRUE; need_maketitle = TRUE; /* set window title later */ } - buf_set_changedtick(buf, buf->b_changedtick + 1); + buf_inc_changedtick(buf); } /* diff --git a/src/nvim/normal.c b/src/nvim/normal.c index a649777ddd..570368991a 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -1213,11 +1213,11 @@ static void normal_check_cursor_moved(NormalState *s) static void normal_check_text_changed(NormalState *s) { - // Trigger TextChanged if b_changedtick differs. + // Trigger TextChanged if changedtick differs. if (!finish_op && has_event(EVENT_TEXTCHANGED) - && curbuf->b_last_changedtick != curbuf->b_changedtick) { + && curbuf->b_last_changedtick != buf_get_changedtick(curbuf)) { apply_autocmds(EVENT_TEXTCHANGED, NULL, NULL, false, curbuf); - curbuf->b_last_changedtick = curbuf->b_changedtick; + curbuf->b_last_changedtick = buf_get_changedtick(curbuf); } } diff --git a/src/nvim/syntax.c b/src/nvim/syntax.c index 45f40e8592..53bfd161ca 100644 --- a/src/nvim/syntax.c +++ b/src/nvim/syntax.c @@ -43,6 +43,7 @@ #include "nvim/os/os.h" #include "nvim/os/time.h" #include "nvim/api/private/helpers.h" +#include "nvim/buffer.h" static bool did_syntax_onoff = false; @@ -406,12 +407,12 @@ void syntax_start(win_T *wp, linenr_T lnum) */ if (syn_block != wp->w_s || syn_buf != wp->w_buffer - || changedtick != syn_buf->b_changedtick) { + || changedtick != buf_get_changedtick(syn_buf)) { invalidate_current_state(); syn_buf = wp->w_buffer; syn_block = wp->w_s; } - changedtick = syn_buf->b_changedtick; + changedtick = buf_get_changedtick(syn_buf); syn_win = wp; /* diff --git a/src/nvim/undo.c b/src/nvim/undo.c index a6a3b2cc5f..2055b4879e 100644 --- a/src/nvim/undo.c +++ b/src/nvim/undo.c @@ -2289,7 +2289,7 @@ static void u_undoredo(int undo, bool do_buf_event) unchanged(curbuf, FALSE); } - // because the calls to changed()/unchanged() above will bump b_changedtick + // because the calls to changed()/unchanged() above will bump changedtick // again, we need to send a nvim_buf_lines_event with just the new value of // b:changedtick if (do_buf_event && kv_size(curbuf->update_channels)) { |