Patch 8.2.0751
Problem:    Vim9: performance can be improved.
Solution:   Don't call break.  Inline check for list materialize.  Make an
            inline version of ga_grow().
Files:      src/vim9execute.vim, src/macros.h, src/evalfunc.c, src/misc2.c,
            src/proto/misc2.pro, src/channel.c, src/eval.c, src/evalbuffer.c,
            src/evalvars.c, src/filepath.c, src/highlight.c, src/insexpand.c,
            src/json.c, src/list.c, src/popupmenu.c, src/popupwin.c,
            src/userfunc.c, src/if_py_both.h


diff: ../vim-8.2.0750/src/vim9execute.vim: No such file or directory
diff: src/vim9execute.vim: No such file or directory
*** ../vim-8.2.0750/src/macros.h        2020-04-12 20:55:16.994819669 +0200
--- src/macros.h        2020-05-13 22:30:25.756489771 +0200
***************
*** 373,375 ****
--- 373,381 ----
  # define ESTACK_CHECK_NOW
  # define CHECK_CURBUF
  #endif
+ 
+ // Inline the condition for performance.
+ #define CHECK_LIST_MATERIALIZE(l) if ((l)->lv_first == &range_list_item) 
range_list_materialize(l)
+ 
+ // Inlined version of ga_grow().  Especially useful if "n" is a constant.
+ #define GA_GROW(gap, n) (((gap)->ga_maxlen - (gap)->ga_len < n) ? 
ga_grow_inner((gap), (n)) : OK)
*** ../vim-8.2.0750/src/evalfunc.c      2020-05-13 16:34:10.401723784 +0200
--- src/evalfunc.c      2020-05-13 21:27:41.096446633 +0200
***************
*** 2275,2281 ****
      {
        listitem_T      *item;
  
!       range_list_materialize(list);
        item = list->lv_first;
        do_cmdline(NULL, get_list_line, (void *)&item,
                      DOCMD_NOWAIT|DOCMD_VERBOSE|DOCMD_REPEAT|DOCMD_KEYTYPED);
--- 2275,2281 ----
      {
        listitem_T      *item;
  
!       CHECK_LIST_MATERIALIZE(list);
        item = list->lv_first;
        do_cmdline(NULL, get_list_line, (void *)&item,
                      DOCMD_NOWAIT|DOCMD_VERBOSE|DOCMD_REPEAT|DOCMD_KEYTYPED);
***************
*** 2820,2826 ****
                        copy_tv(&arg_pt->pt_argv[i], &pt->pt_argv[i]);
                    if (lv_len > 0)
                    {
!                       range_list_materialize(list);
                        FOR_ALL_LIST_ITEMS(list, li)
                            copy_tv(&li->li_tv, &pt->pt_argv[i++]);
                    }
--- 2820,2826 ----
                        copy_tv(&arg_pt->pt_argv[i], &pt->pt_argv[i]);
                    if (lv_len > 0)
                    {
!                       CHECK_LIST_MATERIALIZE(list);
                        FOR_ALL_LIST_ITEMS(list, li)
                            copy_tv(&li->li_tv, &pt->pt_argv[i++]);
                    }
***************
*** 4912,4918 ****
      l = argvars[0].vval.v_list;
      if (l != NULL)
      {
!       range_list_materialize(l);
        item = l->lv_first;
        if (argvars[2].v_type != VAR_UNKNOWN)
        {
--- 4912,4918 ----
      l = argvars[0].vval.v_list;
      if (l != NULL)
      {
!       CHECK_LIST_MATERIALIZE(l);
        item = l->lv_first;
        if (argvars[2].v_type != VAR_UNKNOWN)
        {
***************
*** 5018,5024 ****
      msg_clr_eos();
  
      l = argvars[0].vval.v_list;
!     range_list_materialize(l);
      FOR_ALL_LIST_ITEMS(l, li)
      {
        msg_puts((char *)tv_get_string(&li->li_tv));
--- 5018,5024 ----
      msg_clr_eos();
  
      l = argvars[0].vval.v_list;
!     CHECK_LIST_MATERIALIZE(l);
      FOR_ALL_LIST_ITEMS(l, li)
      {
        msg_puts((char *)tv_get_string(&li->li_tv));
***************
*** 5494,5500 ****
      {
        if ((l = argvars[0].vval.v_list) == NULL)
            goto theend;
!       range_list_materialize(l);
        li = l->lv_first;
      }
      else
--- 5494,5500 ----
      {
        if ((l = argvars[0].vval.v_list) == NULL)
            goto theend;
!       CHECK_LIST_MATERIALIZE(l);
        li = l->lv_first;
      }
      else
***************
*** 6279,6285 ****
        list_T *list = rettv->vval.v_list;
  
        // Create a non-materialized list.  This is much more efficient and
!       // works with ":for".  If used otherwise range_list_materialize() must
        // be called.
        list->lv_first = &range_list_item;
        list->lv_u.nonmat.lv_start = start;
--- 6279,6285 ----
        list_T *list = rettv->vval.v_list;
  
        // Create a non-materialized list.  This is much more efficient and
!       // works with ":for".  If used otherwise CHECK_LIST_MATERIALIZE() must
        // be called.
        list->lv_first = &range_list_item;
        list->lv_u.nonmat.lv_start = start;
***************
*** 6290,6315 ****
  }
  
  /*
!  * If "list" is a non-materialized list then materialize it now.
   */
      void
  range_list_materialize(list_T *list)
  {
!     if (list->lv_first == &range_list_item)
!     {
!       varnumber_T start = list->lv_u.nonmat.lv_start;
!       varnumber_T end = list->lv_u.nonmat.lv_end;
!       int         stride = list->lv_u.nonmat.lv_stride;
!       varnumber_T i;
! 
!       list->lv_first = NULL;
!       list->lv_u.mat.lv_last = NULL;
!       list->lv_len = 0;
!       list->lv_u.mat.lv_idx_item = NULL;
!       for (i = start; stride > 0 ? i <= end : i >= end; i += stride)
!           if (list_append_number(list, (varnumber_T)i) == FAIL)
!               break;
!     }
  }
  
      static void
--- 6290,6313 ----
  }
  
  /*
!  * Materialize "list".
!  * Do not call directly, use CHECK_LIST_MATERIALIZE()
   */
      void
  range_list_materialize(list_T *list)
  {
!     varnumber_T start = list->lv_u.nonmat.lv_start;
!     varnumber_T end = list->lv_u.nonmat.lv_end;
!     int           stride = list->lv_u.nonmat.lv_stride;
!     varnumber_T i;
! 
!     list->lv_first = NULL;
!     list->lv_u.mat.lv_last = NULL;
!     list->lv_len = 0;
!     list->lv_u.mat.lv_idx_item = NULL;
!     for (i = start; stride > 0 ? i <= end : i >= end; i += stride)
!       if (list_append_number(list, (varnumber_T)i) == FAIL)
!           break;
  }
  
      static void
***************
*** 7327,7333 ****
  
        if (ll != NULL)
        {
!           range_list_materialize(ll);
            FOR_ALL_LIST_ITEMS(ll, li)
            {
                strval = tv_get_string_buf_chk(&li->li_tv, buf);
--- 7325,7331 ----
  
        if (ll != NULL)
        {
!           CHECK_LIST_MATERIALIZE(ll);
            FOR_ALL_LIST_ITEMS(ll, li)
            {
                strval = tv_get_string_buf_chk(&li->li_tv, buf);
*** ../vim-8.2.0750/src/misc2.c 2020-05-13 13:40:12.690995638 +0200
--- src/misc2.c 2020-05-13 22:35:24.791776796 +0200
***************
*** 2054,2083 ****
      int
  ga_grow(garray_T *gap, int n)
  {
      size_t    old_len;
      size_t    new_len;
      char_u    *pp;
  
!     if (gap->ga_maxlen - gap->ga_len < n)
!     {
!       if (n < gap->ga_growsize)
!           n = gap->ga_growsize;
  
!       // A linear growth is very inefficient when the array grows big.  This
!       // is a compromise between allocating memory that won't be used and too
!       // many copy operations. A factor of 1.5 seems reasonable.
!       if (n < gap->ga_len / 2)
!           n = gap->ga_len / 2;
  
!       new_len = gap->ga_itemsize * (gap->ga_len + n);
!       pp = vim_realloc(gap->ga_data, new_len);
!       if (pp == NULL)
!           return FAIL;
!       old_len = gap->ga_itemsize * gap->ga_maxlen;
!       vim_memset(pp + old_len, 0, new_len - old_len);
!       gap->ga_maxlen = gap->ga_len + n;
!       gap->ga_data = pp;
!     }
      return OK;
  }
  
--- 2054,2088 ----
      int
  ga_grow(garray_T *gap, int n)
  {
+     if (gap->ga_maxlen - gap->ga_len < n)
+       return ga_grow_inner(gap, n);
+     return OK;
+ }
+ 
+     int
+ ga_grow_inner(garray_T *gap, int n)
+ {
      size_t    old_len;
      size_t    new_len;
      char_u    *pp;
  
!     if (n < gap->ga_growsize)
!       n = gap->ga_growsize;
  
!     // A linear growth is very inefficient when the array grows big.  This
!     // is a compromise between allocating memory that won't be used and too
!     // many copy operations. A factor of 1.5 seems reasonable.
!     if (n < gap->ga_len / 2)
!       n = gap->ga_len / 2;
  
!     new_len = gap->ga_itemsize * (gap->ga_len + n);
!     pp = vim_realloc(gap->ga_data, new_len);
!     if (pp == NULL)
!       return FAIL;
!     old_len = gap->ga_itemsize * gap->ga_maxlen;
!     vim_memset(pp + old_len, 0, new_len - old_len);
!     gap->ga_maxlen = gap->ga_len + n;
!     gap->ga_data = pp;
      return OK;
  }
  
*** ../vim-8.2.0750/src/proto/misc2.pro 2020-02-14 13:21:55.646197062 +0100
--- src/proto/misc2.pro 2020-05-13 22:35:13.499805887 +0200
***************
*** 59,64 ****
--- 59,65 ----
  void ga_init(garray_T *gap);
  void ga_init2(garray_T *gap, int itemsize, int growsize);
  int ga_grow(garray_T *gap, int n);
+ int ga_grow_inner(garray_T *gap, int n);
  char_u *ga_concat_strings(garray_T *gap, char *sep);
  void ga_add_string(garray_T *gap, char_u *p);
  void ga_concat(garray_T *gap, char_u *s);
*** ../vim-8.2.0750/src/channel.c       2020-05-13 13:40:12.690995638 +0200
--- src/channel.c       2020-05-13 21:24:41.684984289 +0200
***************
*** 2399,2405 ****
        list_T      *l = item->jq_value->vval.v_list;
        typval_T    *tv;
  
!       range_list_materialize(l);
        tv = &l->lv_first->li_tv;
  
        if ((without_callback || !item->jq_no_callback)
--- 2399,2405 ----
        list_T      *l = item->jq_value->vval.v_list;
        typval_T    *tv;
  
!       CHECK_LIST_MATERIALIZE(l);
        tv = &l->lv_first->li_tv;
  
        if ((without_callback || !item->jq_no_callback)
***************
*** 5302,5308 ****
                    return FAIL;
                }
  
!               range_list_materialize(item->vval.v_list);
                li = item->vval.v_list->lv_first;
                for (; li != NULL && n < 16; li = li->li_next, n++)
                {
--- 5302,5308 ----
                    return FAIL;
                }
  
!               CHECK_LIST_MATERIALIZE(item->vval.v_list);
                li = item->vval.v_list->lv_first;
                for (; li != NULL && n < 16; li = li->li_next, n++)
                {
***************
*** 5729,5735 ****
      listitem_T  *li;
      char_u    *s;
  
!     range_list_materialize(l);
      FOR_ALL_LIST_ITEMS(l, li)
      {
        s = tv_get_string_chk(&li->li_tv);
--- 5729,5735 ----
      listitem_T  *li;
      char_u    *s;
  
!     CHECK_LIST_MATERIALIZE(l);
      FOR_ALL_LIST_ITEMS(l, li)
      {
        s = tv_get_string_chk(&li->li_tv);
*** ../vim-8.2.0750/src/eval.c  2020-05-06 21:06:26.425435628 +0200
--- src/eval.c  2020-05-13 21:24:57.792936954 +0200
***************
*** 1449,1455 ****
                else
                {
                    // Need a real list here.
!                   range_list_materialize(l);
  
                    // No need to increment the refcount, it's already set for
                    // the list being used in "tv".
--- 1449,1455 ----
                else
                {
                    // Need a real list here.
!                   CHECK_LIST_MATERIALIZE(l);
  
                    // No need to increment the refcount, it's already set for
                    // the list being used in "tv".
*** ../vim-8.2.0750/src/evalbuffer.c    2020-04-21 22:19:26.055486850 +0200
--- src/evalbuffer.c    2020-05-13 21:25:06.812910364 +0200
***************
*** 183,189 ****
                rettv->vval.v_number = 1;       // FAIL
            goto done;
        }
!       range_list_materialize(l);
        li = l->lv_first;
      }
      else
--- 183,189 ----
                rettv->vval.v_number = 1;       // FAIL
            goto done;
        }
!       CHECK_LIST_MATERIALIZE(l);
        li = l->lv_first;
      }
      else
*** ../vim-8.2.0750/src/evalvars.c      2020-05-09 22:50:04.755323771 +0200
--- src/evalvars.c      2020-05-13 21:27:52.984410271 +0200
***************
*** 863,869 ****
        return FAIL;
      }
  
!     range_list_materialize(l);
      item = l->lv_first;
      while (*arg != ']')
      {
--- 863,869 ----
        return FAIL;
      }
  
!     CHECK_LIST_MATERIALIZE(l);
      item = l->lv_first;
      while (*arg != ']')
      {
*** ../vim-8.2.0750/src/filepath.c      2020-04-06 23:49:46.339388207 +0200
--- src/filepath.c      2020-05-13 21:27:58.244394155 +0200
***************
*** 1917,1923 ****
        list = argvars[0].vval.v_list;
        if (list == NULL)
            return;
!       range_list_materialize(list);
        FOR_ALL_LIST_ITEMS(list, li)
            if (tv_get_string_chk(&li->li_tv) == NULL)
                return;
--- 1917,1923 ----
        list = argvars[0].vval.v_list;
        if (list == NULL)
            return;
!       CHECK_LIST_MATERIALIZE(list);
        FOR_ALL_LIST_ITEMS(list, li)
            if (tv_get_string_chk(&li->li_tv) == NULL)
                return;
*** ../vim-8.2.0750/src/highlight.c     2020-04-25 15:35:29.445976506 +0200
--- src/highlight.c     2020-05-13 21:28:03.248378810 +0200
***************
*** 3743,3749 ****
        listitem_T      *li;
        int             i;
  
!       range_list_materialize(pos_list);
        for (i = 0, li = pos_list->lv_first; li != NULL && i < MAXPOSMATCH;
                                                        i++, li = li->li_next)
        {
--- 3743,3749 ----
        listitem_T      *li;
        int             i;
  
!       CHECK_LIST_MATERIALIZE(pos_list);
        for (i = 0, li = pos_list->lv_first; li != NULL && i < MAXPOSMATCH;
                                                        i++, li = li->li_next)
        {
*** ../vim-8.2.0750/src/insexpand.c     2020-04-30 22:29:36.622024155 +0200
--- src/insexpand.c     2020-05-13 21:28:07.784364888 +0200
***************
*** 2334,2340 ****
      int               dir = compl_direction;
  
      // Go through the List with matches and add each of them.
!     range_list_materialize(list);
      FOR_ALL_LIST_ITEMS(list, li)
      {
        if (ins_compl_add_tv(&li->li_tv, dir) == OK)
--- 2334,2340 ----
      int               dir = compl_direction;
  
      // Go through the List with matches and add each of them.
!     CHECK_LIST_MATERIALIZE(list);
      FOR_ALL_LIST_ITEMS(list, li)
      {
        if (ins_compl_add_tv(&li->li_tv, dir) == OK)
***************
*** 2519,2525 ****
      else
      {
        what_flag = 0;
!       range_list_materialize(what_list);
        FOR_ALL_LIST_ITEMS(what_list, item)
        {
            char_u *what = tv_get_string(&item->li_tv);
--- 2519,2525 ----
      else
      {
        what_flag = 0;
!       CHECK_LIST_MATERIALIZE(what_list);
        FOR_ALL_LIST_ITEMS(what_list, item)
        {
            char_u *what = tv_get_string(&item->li_tv);
*** ../vim-8.2.0750/src/json.c  2020-04-05 21:38:11.637962358 +0200
--- src/json.c  2020-05-13 21:28:10.664356041 +0200
***************
*** 265,271 ****
  
                    l->lv_copyID = copyID;
                    ga_append(gap, '[');
!                   range_list_materialize(l);
                    for (li = l->lv_first; li != NULL && !got_int; )
                    {
                        if (json_encode_item(gap, &li->li_tv, copyID,
--- 265,271 ----
  
                    l->lv_copyID = copyID;
                    ga_append(gap, '[');
!                   CHECK_LIST_MATERIALIZE(l);
                    for (li = l->lv_first; li != NULL && !got_int; )
                    {
                        if (json_encode_item(gap, &li->li_tv, copyID,
*** ../vim-8.2.0750/src/list.c  2020-04-25 15:24:40.551354115 +0200
--- src/list.c  2020-05-13 21:28:27.672303711 +0200
***************
*** 378,385 ****
      if (l1 == NULL || l2 == NULL)
        return FALSE;
  
!     range_list_materialize(l1);
!     range_list_materialize(l2);
  
      for (item1 = l1->lv_first, item2 = l2->lv_first;
            item1 != NULL && item2 != NULL;
--- 378,385 ----
      if (l1 == NULL || l2 == NULL)
        return FALSE;
  
!     CHECK_LIST_MATERIALIZE(l1);
!     CHECK_LIST_MATERIALIZE(l2);
  
      for (item1 = l1->lv_first, item2 = l2->lv_first;
            item1 != NULL && item2 != NULL;
***************
*** 411,417 ****
      if (n < 0 || n >= l->lv_len)
        return NULL;
  
!     range_list_materialize(l);
  
      // When there is a cached index may start search from there.
      if (l->lv_u.mat.lv_idx_item != NULL)
--- 411,417 ----
      if (n < 0 || n >= l->lv_len)
        return NULL;
  
!     CHECK_LIST_MATERIALIZE(l);
  
      // When there is a cached index may start search from there.
      if (l->lv_u.mat.lv_idx_item != NULL)
***************
*** 541,547 ****
  
      if (l == NULL)
        return -1;
!     range_list_materialize(l);
      idx = 0;
      for (li = l->lv_first; li != NULL && li != item; li = li->li_next)
        ++idx;
--- 541,547 ----
  
      if (l == NULL)
        return -1;
!     CHECK_LIST_MATERIALIZE(l);
      idx = 0;
      for (li = l->lv_first; li != NULL && li != item; li = li->li_next)
        ++idx;
***************
*** 556,562 ****
      void
  list_append(list_T *l, listitem_T *item)
  {
!     range_list_materialize(l);
      if (l->lv_u.mat.lv_last == NULL)
      {
        // empty list
--- 556,562 ----
      void
  list_append(list_T *l, listitem_T *item)
  {
!     CHECK_LIST_MATERIALIZE(l);
      if (l->lv_u.mat.lv_last == NULL)
      {
        // empty list
***************
*** 706,712 ****
      void
  list_insert(list_T *l, listitem_T *ni, listitem_T *item)
  {
!     range_list_materialize(l);
      if (item == NULL)
        // Append new item at end of list.
        list_append(l, ni);
--- 706,712 ----
      void
  list_insert(list_T *l, listitem_T *ni, listitem_T *item)
  {
!     CHECK_LIST_MATERIALIZE(l);
      if (item == NULL)
        // Append new item at end of list.
        list_append(l, ni);
***************
*** 741,748 ****
      listitem_T        *item;
      int               todo = l2->lv_len;
  
!     range_list_materialize(l1);
!     range_list_materialize(l2);
  
      // We also quit the loop when we have inserted the original item count of
      // the list, avoid a hang when we extend a list with itself.
--- 741,748 ----
      listitem_T        *item;
      int               todo = l2->lv_len;
  
!     CHECK_LIST_MATERIALIZE(l1);
!     CHECK_LIST_MATERIALIZE(l2);
  
      // We also quit the loop when we have inserted the original item count of
      // the list, avoid a hang when we extend a list with itself.
***************
*** 801,807 ****
            orig->lv_copyID = copyID;
            orig->lv_copylist = copy;
        }
!       range_list_materialize(orig);
        for (item = orig->lv_first; item != NULL && !got_int;
                                                         item = item->li_next)
        {
--- 801,807 ----
            orig->lv_copyID = copyID;
            orig->lv_copylist = copy;
        }
!       CHECK_LIST_MATERIALIZE(orig);
        for (item = orig->lv_first; item != NULL && !got_int;
                                                         item = item->li_next)
        {
***************
*** 842,848 ****
  {
      listitem_T        *ip;
  
!     range_list_materialize(l);
  
      // notify watchers
      for (ip = item; ip != NULL; ip = ip->li_next)
--- 842,848 ----
  {
      listitem_T        *ip;
  
!     CHECK_LIST_MATERIALIZE(l);
  
      // notify watchers
      for (ip = item; ip != NULL; ip = ip->li_next)
***************
*** 877,883 ****
        return NULL;
      ga_init2(&ga, (int)sizeof(char), 80);
      ga_append(&ga, '[');
!     range_list_materialize(tv->vval.v_list);
      if (list_join(&ga, tv->vval.v_list, (char_u *)", ",
                                       FALSE, restore_copyID, copyID) == FAIL)
      {
--- 877,883 ----
        return NULL;
      ga_init2(&ga, (int)sizeof(char), 80);
      ga_append(&ga, '[');
!     CHECK_LIST_MATERIALIZE(tv->vval.v_list);
      if (list_join(&ga, tv->vval.v_list, (char_u *)", ",
                                       FALSE, restore_copyID, copyID) == FAIL)
      {
***************
*** 915,921 ****
      char_u    *s;
  
      // Stringify each item in the list.
!     range_list_materialize(l);
      for (item = l->lv_first; item != NULL && !got_int; item = item->li_next)
      {
        s = echo_string_core(&item->li_tv, &tofree, numbuf, copyID,
--- 915,921 ----
      char_u    *s;
  
      // Stringify each item in the list.
!     CHECK_LIST_MATERIALIZE(l);
      for (item = l->lv_first; item != NULL && !got_int; item = item->li_next)
      {
        s = echo_string_core(&item->li_tv, &tofree, numbuf, copyID,
***************
*** 1116,1122 ****
      int               ret = OK;
      char_u    *s;
  
!     range_list_materialize(list);
      FOR_ALL_LIST_ITEMS(list, li)
      {
        for (s = tv_get_string(&li->li_tv); *s != NUL; ++s)
--- 1116,1122 ----
      int               ret = OK;
      char_u    *s;
  
!     CHECK_LIST_MATERIALIZE(list);
      FOR_ALL_LIST_ITEMS(list, li)
      {
        for (s = tv_get_string(&li->li_tv); *s != NUL; ++s)
***************
*** 1203,1209 ****
      if (argvars[1].v_type != VAR_UNKNOWN)
        utf8 = (int)tv_get_number_chk(&argvars[1], NULL);
  
!     range_list_materialize(l);
      ga_init2(&ga, 1, 80);
      if (has_mbyte || utf8)
      {
--- 1203,1209 ----
      if (argvars[1].v_type != VAR_UNKNOWN)
        utf8 = (int)tv_get_number_chk(&argvars[1], NULL);
  
!     CHECK_LIST_MATERIALIZE(l);
      ga_init2(&ga, 1, 80);
      if (has_mbyte || utf8)
      {
***************
*** 1496,1502 ****
                                                                        TRUE))
            goto theend;
        rettv_list_set(rettv, l);
!       range_list_materialize(l);
  
        len = list_len(l);
        if (len <= 1)
--- 1496,1502 ----
                                                                        TRUE))
            goto theend;
        rettv_list_set(rettv, l);
!       CHECK_LIST_MATERIALIZE(l);
  
        len = list_len(l);
        if (len <= 1)
***************
*** 1873,1879 ****
            // set_vim_var_nr() doesn't set the type
            set_vim_var_type(VV_KEY, VAR_NUMBER);
  
!           range_list_materialize(l);
            if (map && l->lv_lock == 0)
                l->lv_lock = VAR_LOCKED;
            for (li = l->lv_first; li != NULL; li = nli)
--- 1873,1879 ----
            // set_vim_var_nr() doesn't set the type
            set_vim_var_type(VV_KEY, VAR_NUMBER);
  
!           CHECK_LIST_MATERIALIZE(l);
            if (map && l->lv_lock == 0)
                l->lv_lock = VAR_LOCKED;
            for (li = l->lv_first; li != NULL; li = nli)
***************
*** 2011,2017 ****
  
        if ((l = argvars[0].vval.v_list) != NULL)
        {
!           range_list_materialize(l);
            li = l->lv_first;
            if (argvars[2].v_type != VAR_UNKNOWN)
            {
--- 2011,2017 ----
  
        if ((l = argvars[0].vval.v_list) != NULL)
        {
!           CHECK_LIST_MATERIALIZE(l);
            li = l->lv_first;
            if (argvars[2].v_type != VAR_UNKNOWN)
            {
*** ../vim-8.2.0750/src/popupmenu.c     2020-05-02 14:52:50.672723470 +0200
--- src/popupmenu.c     2020-05-13 21:28:36.392276823 +0200
***************
*** 1318,1324 ****
        balloon_array = ALLOC_CLEAR_MULT(pumitem_T, list->lv_len);
        if (balloon_array == NULL)
            return;
!       range_list_materialize(list);
        for (idx = 0, li = list->lv_first; li != NULL; li = li->li_next, ++idx)
        {
            char_u *text = tv_get_string_chk(&li->li_tv);
--- 1318,1324 ----
        balloon_array = ALLOC_CLEAR_MULT(pumitem_T, list->lv_len);
        if (balloon_array == NULL)
            return;
!       CHECK_LIST_MATERIALIZE(list);
        for (idx = 0, li = list->lv_first; li != NULL; li = li->li_next, ++idx)
        {
            char_u *text = tv_get_string_chk(&li->li_tv);
*** ../vim-8.2.0750/src/popupwin.c      2020-05-13 16:34:10.401723784 +0200
--- src/popupwin.c      2020-05-13 21:28:44.564251591 +0200
***************
*** 98,104 ****
                array[i] = 1;
            if (list != NULL)
            {
!               range_list_materialize(list);
                for (i = 0, li = list->lv_first; i < 4 && i < list->lv_len;
                                                         ++i, li = li->li_next)
                {
--- 98,104 ----
                array[i] = 1;
            if (list != NULL)
            {
!               CHECK_LIST_MATERIALIZE(list);
                for (i = 0, li = list->lv_first; i < 4 && i < list->lv_len;
                                                         ++i, li = li->li_next)
                {
***************
*** 516,522 ****
        int         mincol;
        int         maxcol;
  
!       range_list_materialize(l);
        li = l->lv_first;
        if (l->lv_len == 3)
        {
--- 516,522 ----
        int         mincol;
        int         maxcol;
  
!       CHECK_LIST_MATERIALIZE(l);
        li = l->lv_first;
        if (l->lv_len == 3)
        {
***************
*** 756,762 ****
            listitem_T  *li;
            int         i;
  
!           range_list_materialize(list);
            for (i = 0, li = list->lv_first; i < 4 && i < list->lv_len;
                                                     ++i, li = li->li_next)
            {
--- 756,762 ----
            listitem_T  *li;
            int         i;
  
!           CHECK_LIST_MATERIALIZE(list);
            for (i = 0, li = list->lv_first; i < 4 && i < list->lv_len;
                                                     ++i, li = li->li_next)
            {
***************
*** 790,796 ****
  
            if (list != NULL)
            {
!               range_list_materialize(list);
                for (i = 0, li = list->lv_first; i < 8 && i < list->lv_len;
                                                         ++i, li = li->li_next)
                {
--- 790,796 ----
  
            if (list != NULL)
            {
!               CHECK_LIST_MATERIALIZE(list);
                for (i = 0, li = list->lv_first; i < 8 && i < list->lv_len;
                                                         ++i, li = li->li_next)
                {
***************
*** 845,851 ****
                    break;
                }
                else
!                   range_list_materialize(li->li_tv.vval.v_list);
            }
        }
        if (ok)
--- 845,851 ----
                    break;
                }
                else
!                   CHECK_LIST_MATERIALIZE(li->li_tv.vval.v_list);
            }
        }
        if (ok)
*** ../vim-8.2.0750/src/userfunc.c      2020-05-09 22:50:04.755323771 +0200
--- src/userfunc.c      2020-05-13 21:28:47.580242270 +0200
***************
*** 1718,1724 ****
      int               argc = 0;
      int               r = 0;
  
!     range_list_materialize(l);
      FOR_ALL_LIST_ITEMS(l, item)
      {
        if (argc == MAX_FUNC_ARGS - (partial == NULL ? 0 : partial->pt_argc))
--- 1718,1724 ----
      int               argc = 0;
      int               r = 0;
  
!     CHECK_LIST_MATERIALIZE(l);
      FOR_ALL_LIST_ITEMS(l, item)
      {
        if (argc == MAX_FUNC_ARGS - (partial == NULL ? 0 : partial->pt_argc))
*** ../vim-8.2.0750/src/if_py_both.h    2020-05-11 23:13:56.929111324 +0200
--- src/if_py_both.h    2020-05-13 21:28:53.828222937 +0200
***************
*** 785,791 ****
            return NULL;
        }
  
!       range_list_materialize(list);
        FOR_ALL_LIST_ITEMS(list, curr)
        {
            if (!(newObj = VimToPython(&curr->li_tv, depth + 1, lookup_dict)))
--- 785,791 ----
            return NULL;
        }
  
!       CHECK_LIST_MATERIALIZE(list);
        FOR_ALL_LIST_ITEMS(list, curr)
        {
            if (!(newObj = VimToPython(&curr->li_tv, depth + 1, lookup_dict)))
***************
*** 2256,2262 ****
        return NULL;
      self->list = list;
      ++list->lv_refcount;
!     range_list_materialize(list);
  
      pyll_add((PyObject *)(self), &self->ref, &lastlist);
  
--- 2256,2262 ----
        return NULL;
      self->list = list;
      ++list->lv_refcount;
!     CHECK_LIST_MATERIALIZE(list);
  
      pyll_add((PyObject *)(self), &self->ref, &lastlist);
  
***************
*** 2824,2830 ****
        return NULL;
      }
  
!     range_list_materialize(l);
      list_add_watch(l, &lii->lw);
      lii->lw.lw_item = l->lv_first;
      lii->list = l;
--- 2824,2830 ----
        return NULL;
      }
  
!     CHECK_LIST_MATERIALIZE(l);
      list_add_watch(l, &lii->lw);
      lii->lw.lw_item = l->lv_first;
      lii->list = l;
***************
*** 3021,3027 ****
                return NULL;
            }
            argslist = argstv.vval.v_list;
!           range_list_materialize(argslist);
  
            argc = argslist->lv_len;
            if (argc != 0)
--- 3021,3027 ----
                return NULL;
            }
            argslist = argstv.vval.v_list;
!           CHECK_LIST_MATERIALIZE(argslist);
  
            argc = argslist->lv_len;
            if (argc != 0)

-- 
>From "know your smileys":
 :-| :-|   Deja' vu!

 /// Bram Moolenaar -- b...@moolenaar.net -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/202005132044.04DKiw2j001955%40masaka.moolenaar.net.

Raspunde prin e-mail lui