diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-12-18 17:23:14 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-12-18 17:23:14 +0100 |
commit | 3beaf9cd8efa3ba83e07187215004d140b89d529 (patch) | |
tree | 193f21162a9cb4dc605cd16b1e8ab639d1d60520 | |
parent | 6e562fcc07c71ad1437c89c3d3cc423efb691f0a (diff) | |
download | vim-git-3beaf9cd8efa3ba83e07187215004d140b89d529.tar.gz |
patch 8.2.2159: Vim9: when declaring a list it is not allocated yetv8.2.2159
Problem: Vim9: when declaring a list it is not allocated yet, causing a
following extend() to fail.
Solution: When fetching a variable value for a list or dict that is null
allocate the list or dict, so it can be used. (closes #7491)
-rw-r--r-- | src/testdir/test_vim9_assign.vim | 13 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9execute.c | 21 |
3 files changed, 35 insertions, 1 deletions
diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim index ad7b85b5f..c9872d4e6 100644 --- a/src/testdir/test_vim9_assign.vim +++ b/src/testdir/test_vim9_assign.vim @@ -391,6 +391,16 @@ def Test_extend_list() assert_equal(['a', 'b'], list) END CheckScriptSuccess(lines) + lines =<< trim END + vim9script + var list: list<string> + def Func() + extend(list, ['x', 'b']) + enddef + Func() + assert_equal(['x', 'b'], list) + END + CheckScriptSuccess(lines) lines =<< trim END vim9script @@ -584,8 +594,9 @@ def Test_assignment_dict() return test enddef FillDict() + assert_equal({a: 43}, test) END - CheckScriptFailure(lines, 'E1103:') + CheckScriptSuccess(lines) # assignment to global dict lines =<< trim END diff --git a/src/version.c b/src/version.c index 96aa9b004..c9d866533 100644 --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2159, +/**/ 2158, /**/ 2157, diff --git a/src/vim9execute.c b/src/vim9execute.c index 351ea8b3b..64b42cb05 100644 --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -791,6 +791,26 @@ store_var(char_u *name, typval_T *tv) restore_funccal(); } +/* + * When the value of "sv" is a null list of dict, allocate it. + */ + static void +allocate_if_null(typval_T *tv) +{ + switch (tv->v_type) + { + case VAR_LIST: + if (tv->vval.v_list == NULL) + rettv_list_alloc(tv); + break; + case VAR_DICT: + if (tv->vval.v_dict == NULL) + rettv_dict_alloc(tv); + break; + default: + break; + } +} /* * Execute a function by "name". @@ -1289,6 +1309,7 @@ call_def_function( sv = ((svar_T *)si->sn_var_vals.ga_data) + iptr->isn_arg.script.script_idx; + allocate_if_null(sv->sv_tv); if (GA_GROW(&ectx.ec_stack, 1) == FAIL) goto failed; copy_tv(sv->sv_tv, STACK_TV_BOT(0)); |