From: Bram Moolenaar Date: Sat, 4 Jul 2020 17:19:43 +0000 (+0200) Subject: patch 8.2.1127: Vim9: getting a dict member may not work X-Git-Tag: v8.2.1127 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fb9d5c51c8b5b44863f974e1adbee9ae330e75ff;p=vim patch 8.2.1127: Vim9: getting a dict member may not work Problem: Vim9: getting a dict member may not work. Solution: Clear the dict only after copying the item. (closes #6390) --- diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim index a604de2b0..3bf578059 100644 --- a/src/testdir/test_vim9_expr.vim +++ b/src/testdir/test_vim9_expr.vim @@ -1133,6 +1133,9 @@ def Test_expr_member() let d: dict = g:dict_one assert_equal(1, d['one']) + # getting the one member should clear the dict after getting the item + assert_equal('one', #{one: 'one'}.one) + call CheckDefFailure(["let x = g:dict_one.#$!"], 'E1002:') call CheckDefExecFailure(["let d: dict", "echo d['a']"], 'E716:') call CheckDefExecFailure(["let d: dict", "d = g:list_empty"], 'E1029: Expected dict but got list') diff --git a/src/version.c b/src/version.c index d1607ae15..b406a6957 100644 --- a/src/version.c +++ b/src/version.c @@ -754,6 +754,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1127, /**/ 1126, /**/ diff --git a/src/vim9execute.c b/src/vim9execute.c index b4acb35c1..bcacaabaa 100644 --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -2188,6 +2188,7 @@ call_def_function( { dict_T *dict; dictitem_T *di; + typval_T temp_tv; tv = STACK_TV_BOT(-1); if (tv->v_type != VAR_DICT || tv->vval.v_dict == NULL) @@ -2203,8 +2204,11 @@ call_def_function( semsg(_(e_dictkey), iptr->isn_arg.string); goto failed; } - clear_tv(tv); + // Clear the dict after getting the item, to avoid that it + // make the item invalid. + temp_tv = *tv; copy_tv(&di->di_tv, tv); + clear_tv(&temp_tv); } break;