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