Mercurial > vim
diff src/evalfunc.c @ 20392:4c317d8c1051 v8.2.0751
patch 8.2.0751: Vim9: performance can be improved
Commit: https://github.com/vim/vim/commit/7e9f351b2e69b498c4ee5004d7459844e1ba191a
Author: Bram Moolenaar <Bram@vim.org>
Date: Wed May 13 22:44:22 2020 +0200
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().
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 13 May 2020 22:45:04 +0200 |
parents | 3b3589275ab9 |
children | c225be44692a |
line wrap: on
line diff
--- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -2275,7 +2275,7 @@ execute_common(typval_T *argvars, typval { 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, typva 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 *ret 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 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, typva { 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 *ret 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 *ret } /* - * 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; - - 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; - } + 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,7 +7325,7 @@ f_setreg(typval_T *argvars, typval_T *re 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);