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:
@@ -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);
|
||||
|
Reference in New Issue
Block a user