Mercurial > vim
comparison src/blob.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 | fd855ad74887 |
children | 2650a01b8bbc |
comparison
equal
deleted
inserted
replaced
30424:1a518a4bf1fd | 30425:6c2bbd7d9217 |
---|---|
636 | 636 |
637 copy_tv(&argvars[0], rettv); | 637 copy_tv(&argvars[0], rettv); |
638 } | 638 } |
639 | 639 |
640 /* | 640 /* |
641 * reduce() Blob argvars[0] using the function 'funcname' with arguments in | 641 * Implementaion of reduce() for Blob "argvars[0]" using the function "expr" |
642 * 'funcexe' starting with the initial value argvars[2] and return the result | 642 * starting with the optional initial value "argvars[2]" and return the result |
643 * in 'rettv'. | 643 * in "rettv". |
644 */ | 644 */ |
645 void | 645 void |
646 blob_reduce( | 646 blob_reduce( |
647 typval_T *argvars, | 647 typval_T *argvars, |
648 char_u *func_name, | 648 typval_T *expr, |
649 funcexe_T *funcexe, | |
650 typval_T *rettv) | 649 typval_T *rettv) |
651 { | 650 { |
652 blob_T *b = argvars[0].vval.v_blob; | 651 blob_T *b = argvars[0].vval.v_blob; |
653 int called_emsg_start = called_emsg; | 652 int called_emsg_start = called_emsg; |
654 int r; | 653 int r; |
682 for ( ; i < b->bv_ga.ga_len; i++) | 681 for ( ; i < b->bv_ga.ga_len; i++) |
683 { | 682 { |
684 argv[0] = *rettv; | 683 argv[0] = *rettv; |
685 argv[1].v_type = VAR_NUMBER; | 684 argv[1].v_type = VAR_NUMBER; |
686 argv[1].vval.v_number = blob_get(b, i); | 685 argv[1].vval.v_number = blob_get(b, i); |
687 r = call_func(func_name, -1, rettv, 2, argv, funcexe); | 686 |
687 r = eval_expr_typval(expr, argv, 2, rettv); | |
688 | |
688 clear_tv(&argv[0]); | 689 clear_tv(&argv[0]); |
689 if (r == FAIL || called_emsg != called_emsg_start) | 690 if (r == FAIL || called_emsg != called_emsg_start) |
690 return; | 691 return; |
691 } | 692 } |
692 } | 693 } |