mirror of
https://github.com/neovim/neovim.git
synced 2025-09-06 11:28:22 +00:00
eval: Do not allocate b:changedtick dictionary item
This commit is contained in:
@@ -1443,17 +1443,18 @@ static int top_file_num = 1; ///< highest file number
|
|||||||
static inline void buf_init_changedtick(buf_T *const buf)
|
static inline void buf_init_changedtick(buf_T *const buf)
|
||||||
FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_NONNULL_ALL
|
FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_NONNULL_ALL
|
||||||
{
|
{
|
||||||
dictitem_T *const changedtick_di = dictitem_alloc((char_u *)"changedtick");
|
buf->changedtick_di = (dictitem16_T) {
|
||||||
// For some reason `islocked('b:changedtick')` should return 1. It does not
|
.di_flags = DI_FLAGS_RO|DI_FLAGS_FIX, // Must not include DI_FLAGS_ALLOC.
|
||||||
// do so for other read-only variables which are normally VAR_FIXED.
|
.di_tv = (typval_T) {
|
||||||
changedtick_di->di_flags |= DI_FLAGS_RO|DI_FLAGS_FIX;
|
|
||||||
changedtick_di->di_tv = (typval_T) {
|
|
||||||
.v_type = VAR_NUMBER,
|
.v_type = VAR_NUMBER,
|
||||||
.v_lock = VAR_FIXED,
|
.v_lock = VAR_FIXED,
|
||||||
.vval.v_number = buf->b_changedtick,
|
.vval.v_number = buf->b_changedtick,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
dict_add(buf->b_vars, changedtick_di);
|
STATIC_ASSERT(sizeof("changedtick") <= sizeof(buf->changedtick_di.di_key),
|
||||||
buf->changedtick_val = &changedtick_di->di_tv.vval.v_number;
|
"buf->changedtick_di cannot hold large enough keys");
|
||||||
|
memcpy(buf->changedtick_di.di_key, "changedtick", sizeof("changedtick"));
|
||||||
|
dict_add(buf->b_vars, (dictitem_T *)&buf->changedtick_di);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Add a file name to the buffer list.
|
/// Add a file name to the buffer list.
|
||||||
|
@@ -96,10 +96,11 @@ static inline void buf_set_changedtick(buf_T *const buf, const int changedtick)
|
|||||||
assert(changedtick_di != NULL);
|
assert(changedtick_di != NULL);
|
||||||
assert(changedtick_di->di_tv.v_type == VAR_NUMBER);
|
assert(changedtick_di->di_tv.v_type == VAR_NUMBER);
|
||||||
assert(changedtick_di->di_tv.v_lock == VAR_FIXED);
|
assert(changedtick_di->di_tv.v_lock == VAR_FIXED);
|
||||||
assert(&changedtick_di->di_tv.vval.v_number == buf->changedtick_val);
|
assert(changedtick_di->di_flags == (DI_FLAGS_RO|DI_FLAGS_FIX));
|
||||||
assert(*buf->changedtick_val == (varnumber_T)buf->b_changedtick);
|
assert(changedtick_di == (dictitem_T *)&buf->changedtick_di);
|
||||||
|
assert(&buf->b_changedtick == &buf->changedtick_di.di_tv.vval.v_number);
|
||||||
#endif
|
#endif
|
||||||
*buf->changedtick_val = buf->b_changedtick = changedtick;
|
buf->b_changedtick = changedtick;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define WITH_BUFFER(b, code) \
|
#define WITH_BUFFER(b, code) \
|
||||||
|
@@ -499,8 +499,9 @@ struct file_buffer {
|
|||||||
|
|
||||||
int b_changed; // 'modified': Set to true if something in the
|
int b_changed; // 'modified': Set to true if something in the
|
||||||
// file has been changed and not written out.
|
// file has been changed and not written out.
|
||||||
int b_changedtick; // incremented for each change, also for undo
|
/// Change identifier incremented for each change, including undo
|
||||||
varnumber_T *changedtick_val; // Pointer to the changedtick storage inside b:
|
#define b_changedtick changedtick_di.di_tv.vval.v_number
|
||||||
|
dictitem16_T changedtick_di; // b:changedtick dictionary item.
|
||||||
|
|
||||||
bool b_saving; /* Set to true if we are in the middle of
|
bool b_saving; /* Set to true if we are in the middle of
|
||||||
saving the buffer. */
|
saving the buffer. */
|
||||||
|
@@ -550,7 +550,7 @@ void eval_init(void)
|
|||||||
type_list->lv_lock = VAR_FIXED;
|
type_list->lv_lock = VAR_FIXED;
|
||||||
type_list->lv_refcount = 1;
|
type_list->lv_refcount = 1;
|
||||||
dictitem_T *const di = dictitem_alloc((char_u *) msgpack_type_names[i]);
|
dictitem_T *const di = dictitem_alloc((char_u *) msgpack_type_names[i]);
|
||||||
di->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX;
|
di->di_flags |= DI_FLAGS_RO|DI_FLAGS_FIX;
|
||||||
di->di_tv = (typval_T) {
|
di->di_tv = (typval_T) {
|
||||||
.v_type = VAR_LIST,
|
.v_type = VAR_LIST,
|
||||||
.vval = { .v_list = type_list, },
|
.vval = { .v_list = type_list, },
|
||||||
@@ -6446,9 +6446,8 @@ static void dict_free_contents(dict_T *d) {
|
|||||||
* something recursive causing trouble. */
|
* something recursive causing trouble. */
|
||||||
di = HI2DI(hi);
|
di = HI2DI(hi);
|
||||||
hash_remove(&d->dv_hashtab, hi);
|
hash_remove(&d->dv_hashtab, hi);
|
||||||
clear_tv(&di->di_tv);
|
dictitem_free(di);
|
||||||
xfree(di);
|
todo--;
|
||||||
--todo;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user