summaryrefslogtreecommitdiffstats
path: root/src/dict.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-11-19 19:01:43 +0100
committerBram Moolenaar <Bram@vim.org>2020-11-19 19:01:43 +0100
commit67d1c68f095eb6cbb6355b04972e384d23065c2c (patch)
treeeae38c014c4e57795ebd7cd3d34f8b00614d5649 /src/dict.c
parentc6ca9f3a29bfd6f5269749036f79f63ce6289692 (diff)
patch 8.2.2017: missing part of the dict changev8.2.2017
Problem: Missing part of the dict change. Solution: Also change the script level dict.
Diffstat (limited to 'src/dict.c')
-rw-r--r--src/dict.c31
1 files changed, 27 insertions, 4 deletions
diff --git a/src/dict.c b/src/dict.c
index b3ef35a802..3b965d0ac2 100644
--- a/src/dict.c
+++ b/src/dict.c
@@ -111,6 +111,7 @@ dict_free_contents(dict_T *d)
/*
* Clear hashtab "ht" and dict items it contains.
+ * If "ht" is not freed then you should call hash_init() next!
*/
void
hashtab_free_contents(hashtab_T *ht)
@@ -850,10 +851,32 @@ eval_dict(char_u **arg, typval_T *rettv, evalarg_T *evalarg, int literal)
*arg = skipwhite_and_linebreak(*arg + 1, evalarg);
while (**arg != '}' && **arg != NUL)
{
- if ((literal
- ? get_literal_key(arg, &tvkey)
- : eval1(arg, &tvkey, evalarg)) == FAIL) // recursive!
- goto failret;
+ char_u *p = to_name_end(*arg, FALSE);
+
+ if (literal || (vim9script && *p == ':'))
+ {
+ if (get_literal_key(arg, &tvkey) == FAIL)
+ goto failret;
+ }
+ else
+ {
+ int has_bracket = vim9script && **arg == '[';
+
+ if (has_bracket)
+ *arg = skipwhite(*arg + 1);
+ if (eval1(arg, &tvkey, evalarg) == FAIL) // recursive!
+ goto failret;
+ if (has_bracket)
+ {
+ *arg = skipwhite(*arg);
+ if (**arg != ']')
+ {
+ emsg(_(e_missing_matching_bracket_after_dict_key));
+ return FAIL;
+ }
+ ++*arg;
+ }
+ }
// the colon should come right after the key, but this wasn't checked
// previously, so only require it in Vim9 script.