Mercurial > vim
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) |