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);