summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-12-18 17:23:14 +0100
committerBram Moolenaar <Bram@vim.org>2020-12-18 17:23:14 +0100
commit3beaf9cd8efa3ba83e07187215004d140b89d529 (patch)
tree193f21162a9cb4dc605cd16b1e8ab639d1d60520
parent6e562fcc07c71ad1437c89c3d3cc423efb691f0a (diff)
downloadvim-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.vim13
-rw-r--r--src/version.c2
-rw-r--r--src/vim9execute.c21
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));