# HG changeset patch # User Bram Moolenaar # Date 1593883804 -7200 # Node ID 1561311249bb6d43ef693ff123ef4fd7a5961286 # Parent 26daca3f46b6999ca29d85ab1b1bc7ab8a21dd3a patch 8.2.1127: Vim9: getting a dict member may not work Commit: https://github.com/vim/vim/commit/fb9d5c51c8b5b44863f974e1adbee9ae330e75ff Author: Bram Moolenaar Date: Sat Jul 4 19:19:43 2020 +0200 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 https://github.com/vim/vim/issues/6390) diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim --- 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 --- a/src/version.c +++ b/src/version.c @@ -755,6 +755,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1127, +/**/ 1126, /**/ 1125, diff --git a/src/vim9execute.c b/src/vim9execute.c --- 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;