diff options
author | Yusuke Endoh <[email protected]> | 2024-07-09 18:27:02 +0900 |
---|---|---|
committer | Yusuke Endoh <[email protected]> | 2024-07-10 13:00:47 +0900 |
commit | 114e32b35796ca546f429ee3295607a127d7e519 () | |
tree | 2b733b36a8a32ca043708ed47a1c9c2f5b3d078c | |
parent | 77b12a8aaf40678dd6cfea29ae27b92b3718ae0a (diff) |
Add rb_block_call2, a flexible variant of rb_block_call
This function accepts flags: RB_NO_KEYWORDS, RB_PASS_KEYWORDS, RB_PASS_CALLED_KEYWORDS: Works as the same as rb_block_call_kw. RB_BLOCK_NO_USE_PACKED_ARGS: The given block ("bl_proc") does not use "yielded_arg" of rb_block_call_func_t. Instead, the block accesses the yielded arguments via "argc" and "argv". This flag allows the called method to yield arguments without allocating an Array.
-rw-r--r-- | include/ruby/internal/scan_args.h | 2 | ||||
-rw-r--r-- | internal/imemo.h | 1 | ||||
-rw-r--r-- | internal/vm.h | 2 | ||||
-rw-r--r-- | proc.c | 6 | ||||
-rw-r--r-- | vm_eval.c | 31 |
5 files changed, 41 insertions, 1 deletions
@@ -75,7 +75,7 @@ * Pass keywords if current method is called with keywords, useful for argument * delegation */ -#define RB_PASS_CALLED_KEYWORDS rb_keyword_given_p() /** @} */ @@ -87,6 +87,7 @@ struct vm_ifunc { const void *data; struct vm_ifunc_argc argc; }; struct rb_imemo_tmpbuf_struct { VALUE flags; @@ -77,6 +77,8 @@ VALUE rb_lambda_call(VALUE obj, ID mid, int argc, const VALUE *argv, rb_block_call_func_t bl_proc, int min_argc, int max_argc, VALUE data2); void rb_check_stack_overflow(void); #if USE_YJIT /* vm_exec.c */ @@ -1159,6 +1159,12 @@ rb_block_pair_yield_optimizable(void) return min > 1; } default: return min > 1; } @@ -1558,6 +1558,37 @@ rb_block_call_kw(VALUE obj, ID mid, int argc, const VALUE * argv, return rb_iterate_internal(iterate_method, (VALUE)&arg, bl_proc, data2); } VALUE rb_lambda_call(VALUE obj, ID mid, int argc, const VALUE *argv, rb_block_call_func_t bl_proc, int min_argc, int max_argc, |