mirror of
https://github.com/neovim/neovim.git
synced 2025-09-30 23:18:33 +00:00
vim-patch:8.0.0593: DRY: setting list/dict return value (#8639)
Problem: Duplication of code for adding a list or dict return value.
Solution: Add rettv_dict_set() and rettv_list_set(). (Yegappan Lakshmanan)
45cf6e910c
This commit is contained in:

committed by
Justin M. Keyes

parent
d088331ea3
commit
70626e6a1e
@@ -1914,10 +1914,8 @@ list_T *tv_list_alloc_ret(typval_T *const ret_tv, const ptrdiff_t len)
|
||||
FUNC_ATTR_NONNULL_ALL
|
||||
{
|
||||
list_T *const l = tv_list_alloc(len);
|
||||
ret_tv->vval.v_list = l;
|
||||
ret_tv->v_type = VAR_LIST;
|
||||
tv_list_set_ret(ret_tv, l);
|
||||
ret_tv->v_lock = VAR_UNLOCKED;
|
||||
tv_list_ref(l);
|
||||
return l;
|
||||
}
|
||||
|
||||
@@ -1930,10 +1928,8 @@ void tv_dict_alloc_ret(typval_T *const ret_tv)
|
||||
FUNC_ATTR_NONNULL_ALL
|
||||
{
|
||||
dict_T *const d = tv_dict_alloc();
|
||||
ret_tv->vval.v_dict = d;
|
||||
ret_tv->v_type = VAR_DICT;
|
||||
tv_dict_set_ret(ret_tv, d);
|
||||
ret_tv->v_lock = VAR_UNLOCKED;
|
||||
d->dv_refcount++;
|
||||
}
|
||||
|
||||
//{{{3 Clear
|
||||
|
@@ -413,11 +413,14 @@ static inline void list_log(const list_T *const l,
|
||||
#define TV_DICT_HI2DI(hi) \
|
||||
((dictitem_T *)((hi)->hi_key - offsetof(dictitem_T, di_key)))
|
||||
|
||||
static inline void tv_list_ref(list_T *const l)
|
||||
REAL_FATTR_ALWAYS_INLINE;
|
||||
|
||||
/// Increase reference count for a given list
|
||||
///
|
||||
/// Does nothing for NULL lists.
|
||||
///
|
||||
/// @param[in] l List to modify.
|
||||
/// @param[in,out] l List to modify.
|
||||
static inline void tv_list_ref(list_T *const l)
|
||||
{
|
||||
if (l == NULL) {
|
||||
@@ -426,6 +429,20 @@ static inline void tv_list_ref(list_T *const l)
|
||||
l->lv_refcount++;
|
||||
}
|
||||
|
||||
static inline void tv_list_set_ret(typval_T *const tv, list_T *const l)
|
||||
REAL_FATTR_ALWAYS_INLINE REAL_FATTR_NONNULL_ARG(1);
|
||||
|
||||
/// Set a list as the return value
|
||||
///
|
||||
/// @param[out] tv Object to receive the list
|
||||
/// @param[in,out] l List to pass to the object
|
||||
static inline void tv_list_set_ret(typval_T *const tv, list_T *const l)
|
||||
{
|
||||
tv->v_type = VAR_LIST;
|
||||
tv->vval.v_list = l;
|
||||
tv_list_ref(l);
|
||||
}
|
||||
|
||||
static inline VarLockStatus tv_list_locked(const list_T *const l)
|
||||
REAL_FATTR_PURE REAL_FATTR_WARN_UNUSED_RESULT;
|
||||
|
||||
@@ -588,6 +605,22 @@ static inline listitem_T *tv_list_last(const list_T *const l)
|
||||
return l->lv_last;
|
||||
}
|
||||
|
||||
static inline void tv_dict_set_ret(typval_T *const tv, dict_T *const d)
|
||||
REAL_FATTR_ALWAYS_INLINE REAL_FATTR_NONNULL_ARG(1);
|
||||
|
||||
/// Set a dictionary as the return value
|
||||
///
|
||||
/// @param[out] tv Object to receive the dictionary
|
||||
/// @param[in,out] d Dictionary to pass to the object
|
||||
static inline void tv_dict_set_ret(typval_T *const tv, dict_T *const d)
|
||||
{
|
||||
tv->v_type = VAR_DICT;
|
||||
tv->vval.v_dict = d;
|
||||
if (d != NULL) {
|
||||
d->dv_refcount++;
|
||||
}
|
||||
}
|
||||
|
||||
static inline long tv_dict_len(const dict_T *const d)
|
||||
REAL_FATTR_PURE REAL_FATTR_WARN_UNUSED_RESULT;
|
||||
|
||||
|
Reference in New Issue
Block a user