comparison src/list.c @ 30425:6c2bbd7d9217 v9.0.0548

patch 9.0.0548: reduce() with a compiled lambda could be faster Commit: https://github.com/vim/vim/commit/f1c60d4bf10794265b828afd9c5f7eddacada10b Author: Bram Moolenaar <Bram@vim.org> Date: Thu Sep 22 17:07:00 2022 +0100 patch 9.0.0548: reduce() with a compiled lambda could be faster Problem: reduce() with a compiled lambda could be faster. Solution: Call eval_expr_typval() instead of call_func() directly.
author Bram Moolenaar <Bram@vim.org>
date Thu, 22 Sep 2022 18:15:03 +0200
parents 029c59bf78f1
children 53af60596aba
comparison
equal deleted inserted replaced
30424:1a518a4bf1fd 30425:6c2bbd7d9217
2997 else 2997 else
2998 list_reverse(argvars[0].vval.v_list, rettv); 2998 list_reverse(argvars[0].vval.v_list, rettv);
2999 } 2999 }
3000 3000
3001 /* 3001 /*
3002 * reduce() List argvars[0] using the function 'funcname' with arguments in 3002 * Implementation of reduce() for list "argvars[0]", using the function "expr"
3003 * 'funcexe' starting with the initial value argvars[2] and return the result 3003 * starting with the optional initial value argvars[2] and return the result in
3004 * in 'rettv'. 3004 * "rettv".
3005 */ 3005 */
3006 static void 3006 static void
3007 list_reduce( 3007 list_reduce(
3008 typval_T *argvars, 3008 typval_T *argvars,
3009 char_u *func_name, 3009 typval_T *expr,
3010 funcexe_T *funcexe,
3011 typval_T *rettv) 3010 typval_T *rettv)
3012 { 3011 {
3013 list_T *l = argvars[0].vval.v_list; 3012 list_T *l = argvars[0].vval.v_list;
3014 listitem_T *li = NULL; 3013 listitem_T *li = NULL;
3015 typval_T initial; 3014 typval_T initial;
3047 for ( ; li != NULL; li = li->li_next) 3046 for ( ; li != NULL; li = li->li_next)
3048 { 3047 {
3049 argv[0] = *rettv; 3048 argv[0] = *rettv;
3050 argv[1] = li->li_tv; 3049 argv[1] = li->li_tv;
3051 rettv->v_type = VAR_UNKNOWN; 3050 rettv->v_type = VAR_UNKNOWN;
3052 r = call_func(func_name, -1, rettv, 2, argv, funcexe); 3051
3052 r = eval_expr_typval(expr, argv, 2, rettv);
3053
3053 clear_tv(&argv[0]); 3054 clear_tv(&argv[0]);
3054 if (r == FAIL || called_emsg != called_emsg_start) 3055 if (r == FAIL || called_emsg != called_emsg_start)
3055 break; 3056 break;
3056 } 3057 }
3057 l->lv_lock = prev_locked; 3058 l->lv_lock = prev_locked;
3064 */ 3065 */
3065 void 3066 void
3066 f_reduce(typval_T *argvars, typval_T *rettv) 3067 f_reduce(typval_T *argvars, typval_T *rettv)
3067 { 3068 {
3068 char_u *func_name; 3069 char_u *func_name;
3069 partial_T *partial = NULL;
3070 funcexe_T funcexe;
3071 3070
3072 if (in_vim9script() 3071 if (in_vim9script()
3073 && check_for_string_or_list_or_blob_arg(argvars, 0) == FAIL) 3072 && check_for_string_or_list_or_blob_arg(argvars, 0) == FAIL)
3074 return; 3073 return;
3075 3074
3082 } 3081 }
3083 3082
3084 if (argvars[1].v_type == VAR_FUNC) 3083 if (argvars[1].v_type == VAR_FUNC)
3085 func_name = argvars[1].vval.v_string; 3084 func_name = argvars[1].vval.v_string;
3086 else if (argvars[1].v_type == VAR_PARTIAL) 3085 else if (argvars[1].v_type == VAR_PARTIAL)
3087 { 3086 func_name = partial_name(argvars[1].vval.v_partial);
3088 partial = argvars[1].vval.v_partial;
3089 func_name = partial_name(partial);
3090 }
3091 else 3087 else
3092 func_name = tv_get_string(&argvars[1]); 3088 func_name = tv_get_string(&argvars[1]);
3093 if (func_name == NULL || *func_name == NUL) 3089 if (func_name == NULL || *func_name == NUL)
3094 { 3090 {
3095 emsg(_(e_missing_function_argument)); 3091 emsg(_(e_missing_function_argument));
3096 return; 3092 return;
3097 } 3093 }
3098 3094
3099 CLEAR_FIELD(funcexe);
3100 funcexe.fe_evaluate = TRUE;
3101 funcexe.fe_partial = partial;
3102
3103 if (argvars[0].v_type == VAR_LIST) 3095 if (argvars[0].v_type == VAR_LIST)
3104 list_reduce(argvars, func_name, &funcexe, rettv); 3096 list_reduce(argvars, &argvars[1], rettv);
3105 else if (argvars[0].v_type == VAR_STRING) 3097 else if (argvars[0].v_type == VAR_STRING)
3106 string_reduce(argvars, func_name, &funcexe, rettv); 3098 string_reduce(argvars, &argvars[1], rettv);
3107 else 3099 else
3108 blob_reduce(argvars, func_name, &funcexe, rettv); 3100 blob_reduce(argvars, &argvars[1], rettv);
3109 } 3101 }
3110 3102
3111 #endif // defined(FEAT_EVAL) 3103 #endif // defined(FEAT_EVAL)