comparison src/list.c @ 32818:705d0e1329a5 v9.0.1723

patch 9.0.1723: Fix regression in {func} argument of reduce() Commit: https://github.com/vim/vim/commit/ad0c442f1fcc6fe9c433777ee3e5b9e6addc6d69 Author: zeertzjq <zeertzjq@outlook.com> Date: Thu Aug 17 22:15:47 2023 +0200 patch 9.0.1723: Fix regression in {func} argument of reduce() Problem: Fix regression in {func} argument of reduce() Solution: pass function name as string again Before patch 9.0.0548, passing a string as {func} argument of reduce() is treated as a function name, but after patch 9.0.0548 it is treated as an expression instead, which is useless as reduce() doesn't set any v: variables. This PR restores the behavior of {func} before that patch. Also correct an emsg() call, as e_string_list_or_blob_required doesn't contain format specifiers. closes: #12824 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: zeertzjq <zeertzjq@outlook.com>
author Christian Brabandt <cb@256bit.org>
date Thu, 17 Aug 2023 22:30:02 +0200
parents 939396a5711c
children 06562c9307dd
comparison
equal deleted inserted replaced
32817:4fa5838c6952 32818:705d0e1329a5
2331 int retval = FAIL; 2331 int retval = FAIL;
2332 2332
2333 copy_tv(tv, get_vim_var_tv(VV_VAL)); 2333 copy_tv(tv, get_vim_var_tv(VV_VAL));
2334 argv[0] = *get_vim_var_tv(VV_KEY); 2334 argv[0] = *get_vim_var_tv(VV_KEY);
2335 argv[1] = *get_vim_var_tv(VV_VAL); 2335 argv[1] = *get_vim_var_tv(VV_VAL);
2336 if (eval_expr_typval(expr, argv, 2, fc, newtv) == FAIL) 2336 if (eval_expr_typval(expr, FALSE, argv, 2, fc, newtv) == FAIL)
2337 goto theend; 2337 goto theend;
2338 if (filtermap == FILTERMAP_FILTER) 2338 if (filtermap == FILTERMAP_FILTER)
2339 { 2339 {
2340 int error = FALSE; 2340 int error = FALSE;
2341 2341
3082 argv[1].vval.v_number = range_val; 3082 argv[1].vval.v_number = range_val;
3083 } 3083 }
3084 else 3084 else
3085 argv[1] = li->li_tv; 3085 argv[1] = li->li_tv;
3086 3086
3087 r = eval_expr_typval(expr, argv, 2, fc, rettv); 3087 r = eval_expr_typval(expr, TRUE, argv, 2, fc, rettv);
3088 3088
3089 if (argv[0].v_type != VAR_NUMBER && argv[0].v_type != VAR_UNKNOWN) 3089 if (argv[0].v_type != VAR_NUMBER && argv[0].v_type != VAR_UNKNOWN)
3090 clear_tv(&argv[0]); 3090 clear_tv(&argv[0]);
3091 if (r == FAIL || called_emsg != called_emsg_start) 3091 if (r == FAIL || called_emsg != called_emsg_start)
3092 break; 3092 break;
3123 3123
3124 if (argvars[0].v_type != VAR_STRING 3124 if (argvars[0].v_type != VAR_STRING
3125 && argvars[0].v_type != VAR_LIST 3125 && argvars[0].v_type != VAR_LIST
3126 && argvars[0].v_type != VAR_BLOB) 3126 && argvars[0].v_type != VAR_BLOB)
3127 { 3127 {
3128 semsg(_(e_string_list_or_blob_required), "reduce()"); 3128 emsg(_(e_string_list_or_blob_required));
3129 return; 3129 return;
3130 } 3130 }
3131 3131
3132 if (argvars[1].v_type == VAR_FUNC) 3132 if (argvars[1].v_type == VAR_FUNC)
3133 func_name = argvars[1].vval.v_string; 3133 func_name = argvars[1].vval.v_string;