To: vim_dev@googlegroups.com Subject: Patch 8.2.0751 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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) *** ../vim-8.2.0750/src/version.c 2020-05-13 16:34:10.401723784 +0200 --- src/version.c 2020-05-13 16:53:31.202280571 +0200 *************** *** 748,749 **** --- 748,751 ---- { /* Add new patch number below this line */ + /**/ + 751, /**/ -- From "know your smileys": :-| :-| Deja' vu! /// Bram Moolenaar -- Bram@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 ///