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:
@@ -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
|
||||
|
@@ -750,6 +750,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
2159,
|
||||
/**/
|
||||
2158,
|
||||
/**/
|
||||
|
@@ -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));
|
||||
|
Reference in New Issue
Block a user