Mercurial > vim
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; |