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 }