]> granicus.if.org Git - vim/commitdiff
patch 8.2.1821: Vim9: concatenating to a NULL list doesn't work v8.2.1821
authorBram Moolenaar <Bram@vim.org>
Sat, 10 Oct 2020 13:37:58 +0000 (15:37 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 10 Oct 2020 13:37:58 +0000 (15:37 +0200)
Problem:    Vim9: concatenating to a NULL list doesn't work.
Solution:   Handle a NULL list like an empty list. (closes #7064)

src/list.c
src/testdir/test_vim9_assign.vim
src/version.c

index e86ec8686f2654bc74523aa916da26a70d91a82f..59c614ffbc083447576f89b36c74df1aade40040 100644 (file)
@@ -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.
  * 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)
 {
     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(l2);
 
@@ -854,15 +859,17 @@ list_concat(list_T *l1, list_T *l2, typval_T *tv)
 {
     list_T     *l;
 
-    if (l1 == NULL || l2 == NULL)
-       return FAIL;
-
     // 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)
        return FAIL;
     tv->v_type = VAR_LIST;
     tv->vval.v_list = l;
+    if (l1 == NULL)
+       ++l->lv_refcount;
 
     // append all items from the second list
     return list_extend(l, l2, NULL);
index 189ff4da01b3fc599b5c0e401ba0b0ffa2f26353..1b56df54b5c6bbffd98f0ab240483c66d2aada1c 100644 (file)
@@ -236,6 +236,18 @@ def Test_extend_list()
       assert_equal(#{one: 1}, d)
   END
   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
 
 def Test_single_letter_vars()
index 8e2115e5d3beaa7e104de0a891a6d0ce22ac8cf4..8dabd6059706c74bfa6259bb589627f0e72ccc1d 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1821,
 /**/
     1820,
 /**/