comparison src/eval.c @ 20128:0b35a7ffceb2 v8.2.0619

patch 8.2.0619: null dict is not handled like an empty dict Commit: https://github.com/vim/vim/commit/ea04a6e8baff2f27da7cdd54bf70a5525994f76d Author: Bram Moolenaar <Bram@vim.org> Date: Thu Apr 23 13:38:02 2020 +0200 patch 8.2.0619: null dict is not handled like an empty dict Problem: Null dict is not handled like an empty dict. Solution: Fix the code and add tests. (Yegappan Lakshmanan, closes https://github.com/vim/vim/issues/5968)
author Bram Moolenaar <Bram@vim.org>
date Thu, 23 Apr 2020 13:45:04 +0200
parents 831b1ea43020
children fe8d0a4344df
comparison
equal deleted inserted replaced
20127:a62c4185482f 20128:0b35a7ffceb2
869 && var_check_func_name(key, lp->ll_di == NULL)) 869 && var_check_func_name(key, lp->ll_di == NULL))
870 || !valid_varname(key); 870 || !valid_varname(key);
871 if (len != -1) 871 if (len != -1)
872 key[len] = prevval; 872 key[len] = prevval;
873 if (wrong) 873 if (wrong)
874 {
875 clear_tv(&var1);
874 return NULL; 876 return NULL;
877 }
875 } 878 }
876 879
877 if (lp->ll_di == NULL) 880 if (lp->ll_di == NULL)
878 { 881 {
879 // Can't add "v:" or "a:" variable. 882 // Can't add "v:" or "a:" variable.
4551 break; 4554 break;
4552 4555
4553 case VAR_DICT: 4556 case VAR_DICT:
4554 if (tv->vval.v_dict == NULL) 4557 if (tv->vval.v_dict == NULL)
4555 { 4558 {
4559 // NULL dict is equivalent to empty dict.
4556 *tofree = NULL; 4560 *tofree = NULL;
4557 r = NULL; 4561 r = (char_u *)"{}";
4558 } 4562 }
4559 else if (copyID != 0 && tv->vval.v_dict->dv_copyID == copyID 4563 else if (copyID != 0 && tv->vval.v_dict->dv_copyID == copyID
4560 && tv->vval.v_dict->dv_hashtab.ht_used != 0) 4564 && tv->vval.v_dict->dv_hashtab.ht_used != 0)
4561 { 4565 {
4562 *tofree = NULL; 4566 *tofree = NULL;
4563 r = (char_u *)"{...}"; 4567 r = (char_u *)"{...}";
4564 } 4568 }
4565 else 4569 else
4566 { 4570 {
4567 int old_copyID = tv->vval.v_dict->dv_copyID; 4571 int old_copyID = tv->vval.v_dict->dv_copyID;
4572
4568 tv->vval.v_dict->dv_copyID = copyID; 4573 tv->vval.v_dict->dv_copyID = copyID;
4569 *tofree = dict2string(tv, copyID, restore_copyID); 4574 *tofree = dict2string(tv, copyID, restore_copyID);
4570 if (restore_copyID) 4575 if (restore_copyID)
4571 tv->vval.v_dict->dv_copyID = old_copyID; 4576 tv->vval.v_dict->dv_copyID = old_copyID;
4572 r = *tofree; 4577 r = *tofree;