0
0
mirror of https://github.com/vim/vim.git synced 2025-10-14 07:04:10 -04:00

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().
This commit is contained in:
Bram Moolenaar
2020-05-13 22:44:22 +02:00
parent 37d1b4f941
commit 7e9f351b2e
17 changed files with 89 additions and 79 deletions

View File

@@ -2275,7 +2275,7 @@ execute_common(typval_T *argvars, typval_T *rettv, int arg_off)
{
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 @@ common_function(typval_T *argvars, typval_T *rettv, int is_funcref)
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 @@ f_index(typval_T *argvars, typval_T *rettv)
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 @@ f_inputlist(typval_T *argvars, typval_T *rettv)
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 @@ find_some_match(typval_T *argvars, typval_T *rettv, matchtype_T type)
{
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 @@ f_range(typval_T *argvars, typval_T *rettv)
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 @@ f_range(typval_T *argvars, typval_T *rettv)
}
/*
* 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 @@ f_setreg(typval_T *argvars, typval_T *rettv)
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);