mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
eval: Work with reference cycles in partials (self) properly
This commit is contained in:
parent
6584fb723a
commit
10c6e68db6
@ -19100,7 +19100,7 @@ static inline int _nothing_conv_func_start(typval_T *const tv,
|
||||
#define TYPVAL_ENCODE_CONV_FUNC_BEFORE_ARGS(tv, len)
|
||||
#define TYPVAL_ENCODE_CONV_FUNC_BEFORE_SELF(tv, len)
|
||||
|
||||
static inline void _nothing_conv_func_end(typval_T *const tv)
|
||||
static inline void _nothing_conv_func_end(typval_T *const tv, const int copyID)
|
||||
FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_NONNULL_ALL
|
||||
{
|
||||
if (tv->v_type == VAR_PARTIAL) {
|
||||
@ -19109,7 +19109,9 @@ static inline void _nothing_conv_func_end(typval_T *const tv)
|
||||
return;
|
||||
}
|
||||
// Dictionaly should already be freed by the time.
|
||||
assert(pt->pt_dict == NULL);
|
||||
// If it was not freed then it is a part of the reference cycle.
|
||||
assert(pt->pt_dict == NULL || pt->pt_dict->dv_copyID == copyID);
|
||||
pt->pt_dict = NULL;
|
||||
// As well as all arguments.
|
||||
pt->pt_argc = 0;
|
||||
assert(pt->pt_refcount <= 1);
|
||||
@ -19118,7 +19120,7 @@ static inline void _nothing_conv_func_end(typval_T *const tv)
|
||||
assert(tv->v_lock == VAR_UNLOCKED);
|
||||
}
|
||||
}
|
||||
#define TYPVAL_ENCODE_CONV_FUNC_END(tv) _nothing_conv_func_end(tv)
|
||||
#define TYPVAL_ENCODE_CONV_FUNC_END(tv) _nothing_conv_func_end(tv, copyID)
|
||||
|
||||
#define TYPVAL_ENCODE_CONV_EMPTY_LIST(tv) \
|
||||
do { \
|
||||
|
Loading…
Reference in New Issue
Block a user