patch 8.2.0751: Vim9: performance can be improved
Problem: Vim9: performance can be improved.
Solution: Don't call break. Inline check for list materialize. Make an
inline version of ga_grow().
diff --git a/src/evalfunc.c b/src/evalfunc.c
index c499890..7579208 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -2275,7 +2275,7 @@
{
listitem_T *item;
- range_list_materialize(list);
+ 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,7 +2820,7 @@
copy_tv(&arg_pt->pt_argv[i], &pt->pt_argv[i]);
if (lv_len > 0)
{
- range_list_materialize(list);
+ CHECK_LIST_MATERIALIZE(list);
FOR_ALL_LIST_ITEMS(list, li)
copy_tv(&li->li_tv, &pt->pt_argv[i++]);
}
@@ -4912,7 +4912,7 @@
l = argvars[0].vval.v_list;
if (l != NULL)
{
- range_list_materialize(l);
+ CHECK_LIST_MATERIALIZE(l);
item = l->lv_first;
if (argvars[2].v_type != VAR_UNKNOWN)
{
@@ -5018,7 +5018,7 @@
msg_clr_eos();
l = argvars[0].vval.v_list;
- range_list_materialize(l);
+ CHECK_LIST_MATERIALIZE(l);
FOR_ALL_LIST_ITEMS(l, li)
{
msg_puts((char *)tv_get_string(&li->li_tv));
@@ -5494,7 +5494,7 @@
{
if ((l = argvars[0].vval.v_list) == NULL)
goto theend;
- range_list_materialize(l);
+ CHECK_LIST_MATERIALIZE(l);
li = l->lv_first;
}
else
@@ -6279,7 +6279,7 @@
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
+ // 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,26 +6290,24 @@
}
/*
- * If "list" is a non-materialized list then materialize it now.
+ * Materialize "list".
+ * Do not call directly, use CHECK_LIST_MATERIALIZE()
*/
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;
+ 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;
- }
+ 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,7 +7325,7 @@
if (ll != NULL)
{
- range_list_materialize(ll);
+ CHECK_LIST_MATERIALIZE(ll);
FOR_ALL_LIST_ITEMS(ll, li)
{
strval = tv_get_string_buf_chk(&li->li_tv, buf);