mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
eval: Make sure that copyID is reset when needed
Works by making value pushed on stack represent the exhausted list. Fixes #5901, except for dictionaries which need similar adjustment.
This commit is contained in:
parent
7d0a892b37
commit
a970c1a957
@ -387,6 +387,8 @@ static inline void typval_encode_list_start(EncodedData *const edata,
|
||||
#define TYPVAL_ENCODE_CONV_LIST_START(tv, len) \
|
||||
typval_encode_list_start(edata, (size_t)(len))
|
||||
|
||||
#define TYPVAL_ENCODE_CONV_REAL_LIST_AFTER_START(tv, mpsv)
|
||||
|
||||
static inline void typval_encode_between_list_items(EncodedData *const edata)
|
||||
FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_NONNULL_ALL
|
||||
{
|
||||
@ -499,6 +501,7 @@ static inline void typval_encode_dict_end(EncodedData *const edata)
|
||||
#undef TYPVAL_ENCODE_CONV_FUNC_END
|
||||
#undef TYPVAL_ENCODE_CONV_EMPTY_LIST
|
||||
#undef TYPVAL_ENCODE_CONV_LIST_START
|
||||
#undef TYPVAL_ENCODE_CONV_REAL_LIST_AFTER_START
|
||||
#undef TYPVAL_ENCODE_CONV_EMPTY_DICT
|
||||
#undef TYPVAL_ENCODE_CONV_NIL
|
||||
#undef TYPVAL_ENCODE_CONV_BOOL
|
||||
|
@ -19147,23 +19147,25 @@ static inline void _nothing_conv_func_end(typval_T *const tv, const int copyID)
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
static inline int _nothing_conv_list_start(typval_T *const tv)
|
||||
static inline int _nothing_conv_real_list_after_start(
|
||||
typval_T *const tv, MPConvStackVal *const mpsv)
|
||||
FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_WARN_UNUSED_RESULT
|
||||
{
|
||||
if (tv == NULL) {
|
||||
return NOTDONE;
|
||||
}
|
||||
assert(tv != NULL);
|
||||
tv->v_lock = VAR_UNLOCKED;
|
||||
if (tv->vval.v_list->lv_refcount > 1) {
|
||||
tv->vval.v_list->lv_refcount--;
|
||||
tv->vval.v_list = NULL;
|
||||
mpsv->data.l.li = NULL;
|
||||
return OK;
|
||||
}
|
||||
return NOTDONE;
|
||||
}
|
||||
#define TYPVAL_ENCODE_CONV_LIST_START(tv, len) \
|
||||
#define TYPVAL_ENCODE_CONV_LIST_START(tv, len)
|
||||
|
||||
#define TYPVAL_ENCODE_CONV_REAL_LIST_AFTER_START(tv, mpsv) \
|
||||
do { \
|
||||
if (_nothing_conv_list_start(tv) != NOTDONE) { \
|
||||
if (_nothing_conv_real_list_after_start(tv, &mpsv) != NOTDONE) { \
|
||||
goto typval_encode_stop_converting_one_item; \
|
||||
} \
|
||||
} while (0)
|
||||
@ -19253,6 +19255,7 @@ static inline void _nothing_conv_dict_end(typval_T *const tv,
|
||||
#undef TYPVAL_ENCODE_CONV_EMPTY_LIST
|
||||
#undef TYPVAL_ENCODE_CONV_EMPTY_DICT
|
||||
#undef TYPVAL_ENCODE_CONV_LIST_START
|
||||
#undef TYPVAL_ENCODE_CONV_REAL_LIST_AFTER_START
|
||||
#undef TYPVAL_ENCODE_CONV_LIST_BETWEEN_ITEMS
|
||||
#undef TYPVAL_ENCODE_CONV_LIST_END
|
||||
#undef TYPVAL_ENCODE_CONV_DICT_START
|
||||
|
@ -369,6 +369,8 @@ int encode_read_from_list(ListReaderState *const state, char *const buf,
|
||||
#define TYPVAL_ENCODE_CONV_LIST_START(tv, len) \
|
||||
ga_append(gap, '[')
|
||||
|
||||
#define TYPVAL_ENCODE_CONV_REAL_LIST_AFTER_START(tv, mpsv)
|
||||
|
||||
#define TYPVAL_ENCODE_CONV_EMPTY_DICT(tv, dict) \
|
||||
ga_concat(gap, "{}")
|
||||
|
||||
@ -789,6 +791,7 @@ bool encode_check_json_key(const typval_T *const tv)
|
||||
#undef TYPVAL_ENCODE_CONV_FUNC_END
|
||||
#undef TYPVAL_ENCODE_CONV_EMPTY_LIST
|
||||
#undef TYPVAL_ENCODE_CONV_LIST_START
|
||||
#undef TYPVAL_ENCODE_CONV_REAL_LIST_AFTER_START
|
||||
#undef TYPVAL_ENCODE_CONV_EMPTY_DICT
|
||||
#undef TYPVAL_ENCODE_CONV_NIL
|
||||
#undef TYPVAL_ENCODE_CONV_BOOL
|
||||
@ -933,6 +936,8 @@ char *encode_tv2json(typval_T *tv, size_t *len)
|
||||
#define TYPVAL_ENCODE_CONV_LIST_START(tv, len) \
|
||||
msgpack_pack_array(packer, (size_t)(len))
|
||||
|
||||
#define TYPVAL_ENCODE_CONV_REAL_LIST_AFTER_START(tv, mpsv)
|
||||
|
||||
#define TYPVAL_ENCODE_CONV_EMPTY_DICT(tv, dict) \
|
||||
msgpack_pack_map(packer, 0)
|
||||
|
||||
@ -994,6 +999,7 @@ char *encode_tv2json(typval_T *tv, size_t *len)
|
||||
#undef TYPVAL_ENCODE_CONV_FUNC_END
|
||||
#undef TYPVAL_ENCODE_CONV_EMPTY_LIST
|
||||
#undef TYPVAL_ENCODE_CONV_LIST_START
|
||||
#undef TYPVAL_ENCODE_CONV_REAL_LIST_AFTER_START
|
||||
#undef TYPVAL_ENCODE_CONV_EMPTY_DICT
|
||||
#undef TYPVAL_ENCODE_CONV_NIL
|
||||
#undef TYPVAL_ENCODE_CONV_BOOL
|
||||
|
@ -129,6 +129,16 @@
|
||||
/// point to a special dictionary.
|
||||
/// @param len List length. Is an expression which evaluates to an integer.
|
||||
|
||||
/// @def TYPVAL_ENCODE_CONV_REAL_LIST_AFTER_START
|
||||
/// @brief Macros used after pushing list onto the stack
|
||||
///
|
||||
/// Only used for real list_T* lists, not for special dictionaries or partial
|
||||
/// arguments.
|
||||
///
|
||||
/// @param tv Pointer to typval where value is stored. May be NULL. May
|
||||
/// point to a special dictionary.
|
||||
/// @param mpsv Pushed MPConvStackVal value.
|
||||
|
||||
/// @def TYPVAL_ENCODE_CONV_LIST_BETWEEN_ITEMS
|
||||
/// @brief Macros used after finishing converting non-last list item
|
||||
///
|
||||
@ -354,6 +364,7 @@ static int _TYPVAL_ENCODE_CONVERT_ONE_VALUE(
|
||||
},
|
||||
},
|
||||
}));
|
||||
TYPVAL_ENCODE_CONV_REAL_LIST_AFTER_START(tv, _mp_last(*mpstack));
|
||||
break;
|
||||
}
|
||||
case VAR_SPECIAL: {
|
||||
|
Loading…
Reference in New Issue
Block a user