diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/nvim/eval/typval_encode.c.h | 25 | ||||
| -rw-r--r-- | src/nvim/eval/typval_encode.h | 1 | 
2 files changed, 22 insertions, 4 deletions
| diff --git a/src/nvim/eval/typval_encode.c.h b/src/nvim/eval/typval_encode.c.h index 365eb2dd77..34f88cbc98 100644 --- a/src/nvim/eval/typval_encode.c.h +++ b/src/nvim/eval/typval_encode.c.h @@ -348,6 +348,7 @@ static int _TYPVAL_ENCODE_CONVERT_ONE_VALUE(        _mp_push(*mpstack, ((MPConvStackVal) {          .type = kMPConvPartial,          .tv = tv, +        .saved_copyID = copyID - 1,          .data = {            .p = {              .stage = kMPConvPartialArgs, @@ -362,12 +363,15 @@ static int _TYPVAL_ENCODE_CONVERT_ONE_VALUE(          TYPVAL_ENCODE_CONV_EMPTY_LIST(tv);          break;        } +      const int saved_copyID = tv->vval.v_list->lv_copyID;        _TYPVAL_ENCODE_DO_CHECK_SELF_REFERENCE(tv->vval.v_list, lv_copyID, copyID,                                               kMPConvList);        TYPVAL_ENCODE_CONV_LIST_START(tv, tv->vval.v_list->lv_len); +      assert(saved_copyID != copyID && saved_copyID != copyID - 1);        _mp_push(*mpstack, ((MPConvStackVal) {          .type = kMPConvList,          .tv = tv, +        .saved_copyID = saved_copyID,          .data = {            .l = {              .list = tv->vval.v_list, @@ -495,14 +499,17 @@ static int _TYPVAL_ENCODE_CONVERT_ONE_VALUE(              if (val_di->di_tv.v_type != VAR_LIST) {                goto _convert_one_value_regular_dict;              } +            const int saved_copyID = val_di->di_tv.vval.v_list->lv_copyID;              _TYPVAL_ENCODE_DO_CHECK_SELF_REFERENCE(val_di->di_tv.vval.v_list,                                                     lv_copyID, copyID,                                                     kMPConvList);              TYPVAL_ENCODE_CONV_LIST_START(tv,                                            val_di->di_tv.vval.v_list->lv_len); +            assert(saved_copyID != copyID && saved_copyID != copyID - 1);              _mp_push(*mpstack, ((MPConvStackVal) {                .tv = tv,                .type = kMPConvList, +              .saved_copyID = saved_copyID,                .data = {                  .l = {                    .list = val_di->di_tv.vval.v_list, @@ -528,13 +535,16 @@ static int _TYPVAL_ENCODE_CONVERT_ONE_VALUE(                  goto _convert_one_value_regular_dict;                }              } +            const int saved_copyID = val_di->di_tv.vval.v_list->lv_copyID;              _TYPVAL_ENCODE_DO_CHECK_SELF_REFERENCE(val_list, lv_copyID, copyID,                                                     kMPConvPairs);              TYPVAL_ENCODE_CONV_DICT_START(tv, TYPVAL_ENCODE_NODICT_VAR,                                            val_list->lv_len); +            assert(saved_copyID != copyID && saved_copyID != copyID - 1);              _mp_push(*mpstack, ((MPConvStackVal) {                .tv = tv,                .type = kMPConvPairs, +              .saved_copyID = saved_copyID,                .data = {                  .l = {                    .list = val_list, @@ -569,14 +579,17 @@ static int _TYPVAL_ENCODE_CONVERT_ONE_VALUE(          }          break;        } -_convert_one_value_regular_dict: +_convert_one_value_regular_dict: {} +      const int saved_copyID = tv->vval.v_dict->dv_copyID;        _TYPVAL_ENCODE_DO_CHECK_SELF_REFERENCE(tv->vval.v_dict, dv_copyID, copyID,                                               kMPConvDict);        TYPVAL_ENCODE_CONV_DICT_START(tv, tv->vval.v_dict,                                      tv->vval.v_dict->dv_hashtab.ht_used); +      assert(saved_copyID != copyID && saved_copyID != copyID - 1);        _mp_push(*mpstack, ((MPConvStackVal) {          .tv = tv,          .type = kMPConvDict, +        .saved_copyID = saved_copyID,          .data = {            .d = {              .dict = tv->vval.v_dict, @@ -638,7 +651,7 @@ typval_encode_stop_converting_one_item:        case kMPConvDict: {          if (!cur_mpsv->data.d.todo) {            (void)_mp_pop(mpstack); -          cur_mpsv->data.d.dict->dv_copyID = copyID - 1; +          cur_mpsv->data.d.dict->dv_copyID = cur_mpsv->saved_copyID;            TYPVAL_ENCODE_CONV_DICT_END(cur_mpsv->tv, *cur_mpsv->data.d.dictp);            continue;          } else if (cur_mpsv->data.d.todo @@ -662,7 +675,7 @@ typval_encode_stop_converting_one_item:        case kMPConvList: {          if (cur_mpsv->data.l.li == NULL) {            (void)_mp_pop(mpstack); -          cur_mpsv->data.l.list->lv_copyID = copyID - 1; +          cur_mpsv->data.l.list->lv_copyID = cur_mpsv->saved_copyID;            TYPVAL_ENCODE_CONV_LIST_END(cur_mpsv->tv);            continue;          } else if (cur_mpsv->data.l.li != cur_mpsv->data.l.list->lv_first) { @@ -675,7 +688,7 @@ typval_encode_stop_converting_one_item:        case kMPConvPairs: {          if (cur_mpsv->data.l.li == NULL) {            (void)_mp_pop(mpstack); -          cur_mpsv->data.l.list->lv_copyID = copyID - 1; +          cur_mpsv->data.l.list->lv_copyID = cur_mpsv->saved_copyID;            TYPVAL_ENCODE_CONV_DICT_END(cur_mpsv->tv, TYPVAL_ENCODE_NODICT_VAR);            continue;          } else if (cur_mpsv->data.l.li != cur_mpsv->data.l.list->lv_first) { @@ -711,6 +724,7 @@ typval_encode_stop_converting_one_item:                _mp_push(mpstack, ((MPConvStackVal) {                  .type = kMPConvPartialList,                  .tv = NULL, +                .saved_copyID = copyID - 1,                  .data = {                    .a = {                      .arg = pt->pt_argv, @@ -731,6 +745,7 @@ typval_encode_stop_converting_one_item:                  TYPVAL_ENCODE_CONV_EMPTY_DICT(NULL, pt->pt_dict);                  continue;                } +              const int saved_copyID = dict->dv_copyID;                const int te_csr_ret = _TYPVAL_ENCODE_CHECK_SELF_REFERENCE(                    TYPVAL_ENCODE_FIRST_ARG_NAME,                    dict, &dict->dv_copyID, &mpstack, copyID, kMPConvDict, @@ -744,9 +759,11 @@ typval_encode_stop_converting_one_item:                }                TYPVAL_ENCODE_CONV_DICT_START(NULL, pt->pt_dict,                                              dict->dv_hashtab.ht_used); +              assert(saved_copyID != copyID && saved_copyID != copyID - 1);                _mp_push(mpstack, ((MPConvStackVal) {                  .type = kMPConvDict,                  .tv = NULL, +                .saved_copyID = saved_copyID,                  .data = {                    .d = {                      .dict = dict, diff --git a/src/nvim/eval/typval_encode.h b/src/nvim/eval/typval_encode.h index ba325b8f55..46145c5d03 100644 --- a/src/nvim/eval/typval_encode.h +++ b/src/nvim/eval/typval_encode.h @@ -34,6 +34,7 @@ typedef enum {  typedef struct {    MPConvStackValType type;  ///< Type of the stack entry.    typval_T *tv;  ///< Currently converted typval_T. +  int saved_copyID;  ///< copyID item used to have.    union {      struct {        dict_T *dict;    ///< Currently converted dictionary. | 
