0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

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)
This commit is contained in:
Bram Moolenaar
2020-12-18 17:23:14 +01:00
parent 6e562fcc07
commit 3beaf9cd8e
3 changed files with 35 additions and 1 deletions

View File

@@ -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

View File

@@ -750,6 +750,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
2159,
/**/
2158,
/**/

View File

@@ -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));