forked from aniani/vim
patch 8.2.1821: Vim9: concatenating to a NULL list doesn't work
Problem: Vim9: concatenating to a NULL list doesn't work. Solution: Handle a NULL list like an empty list. (closes #7064)
This commit is contained in:
19
src/list.c
19
src/list.c
@@ -824,7 +824,7 @@ f_flatten(typval_T *argvars, typval_T *rettv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Extend "l1" with "l2".
|
* Extend "l1" with "l2". "l1" must not be NULL.
|
||||||
* If "bef" is NULL append at the end, otherwise insert before this item.
|
* If "bef" is NULL append at the end, otherwise insert before this item.
|
||||||
* Returns FAIL when out of memory.
|
* Returns FAIL when out of memory.
|
||||||
*/
|
*/
|
||||||
@@ -832,8 +832,13 @@ f_flatten(typval_T *argvars, typval_T *rettv)
|
|||||||
list_extend(list_T *l1, list_T *l2, listitem_T *bef)
|
list_extend(list_T *l1, list_T *l2, listitem_T *bef)
|
||||||
{
|
{
|
||||||
listitem_T *item;
|
listitem_T *item;
|
||||||
int todo = l2->lv_len;
|
int todo;
|
||||||
|
|
||||||
|
// NULL list is equivalent to an empty list: nothing to do.
|
||||||
|
if (l2 == NULL || l2->lv_len == 0)
|
||||||
|
return OK;
|
||||||
|
|
||||||
|
todo = l2->lv_len;
|
||||||
CHECK_LIST_MATERIALIZE(l1);
|
CHECK_LIST_MATERIALIZE(l1);
|
||||||
CHECK_LIST_MATERIALIZE(l2);
|
CHECK_LIST_MATERIALIZE(l2);
|
||||||
|
|
||||||
@@ -854,15 +859,17 @@ list_concat(list_T *l1, list_T *l2, typval_T *tv)
|
|||||||
{
|
{
|
||||||
list_T *l;
|
list_T *l;
|
||||||
|
|
||||||
if (l1 == NULL || l2 == NULL)
|
|
||||||
return FAIL;
|
|
||||||
|
|
||||||
// make a copy of the first list.
|
// make a copy of the first list.
|
||||||
l = list_copy(l1, FALSE, 0);
|
if (l1 == NULL)
|
||||||
|
l = list_alloc();
|
||||||
|
else
|
||||||
|
l = list_copy(l1, FALSE, 0);
|
||||||
if (l == NULL)
|
if (l == NULL)
|
||||||
return FAIL;
|
return FAIL;
|
||||||
tv->v_type = VAR_LIST;
|
tv->v_type = VAR_LIST;
|
||||||
tv->vval.v_list = l;
|
tv->vval.v_list = l;
|
||||||
|
if (l1 == NULL)
|
||||||
|
++l->lv_refcount;
|
||||||
|
|
||||||
// append all items from the second list
|
// append all items from the second list
|
||||||
return list_extend(l, l2, NULL);
|
return list_extend(l, l2, NULL);
|
||||||
|
@@ -236,6 +236,18 @@ def Test_extend_list()
|
|||||||
assert_equal(#{one: 1}, d)
|
assert_equal(#{one: 1}, d)
|
||||||
END
|
END
|
||||||
CheckScriptSuccess(lines)
|
CheckScriptSuccess(lines)
|
||||||
|
|
||||||
|
# appending to NULL list from a function
|
||||||
|
lines =<< trim END
|
||||||
|
vim9script
|
||||||
|
var list: list<string>
|
||||||
|
def Func()
|
||||||
|
list += ['a', 'b']
|
||||||
|
enddef
|
||||||
|
Func()
|
||||||
|
assert_equal(['a', 'b'], list)
|
||||||
|
END
|
||||||
|
CheckScriptSuccess(lines)
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
def Test_single_letter_vars()
|
def Test_single_letter_vars()
|
||||||
|
@@ -750,6 +750,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1821,
|
||||||
/**/
|
/**/
|
||||||
1820,
|
1820,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user