diff src/vim9execute.c @ 23227:ccbbbbed371f v8.2.2159

patch 8.2.2159: Vim9: when declaring a list it is not allocated yet Commit: https://github.com/vim/vim/commit/3beaf9cd8efa3ba83e07187215004d140b89d529 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Dec 18 17:23:14 2020 +0100 patch 8.2.2159: Vim9: when declaring a list it is not allocated yet 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)
author Bram Moolenaar <Bram@vim.org>
date Fri, 18 Dec 2020 17:30:04 +0100
parents cc24ac009f29
children b545334ae654
line wrap: on
line diff
--- 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));