From 568472906b178607ee569bff0d3074c27515719e Mon Sep 17 00:00:00 2001 From: nagachika Date: Fri, 4 Aug 2017 14:31:52 +0000 Subject: merge revision(s) 59357,59358: [Backport #13391] [Backport #13404] proc.c: rb_block_min_max_arity * proc.c (rb_block_min_max_arity): new function to get arity range from the current block. vm_eval.c: rb_lambda_call * enum.c (enum_collect): make the block arity same as the given block. [Bug #13391] * internal.h (vm_ifunc): store arity instead of unused id. * proc.c (rb_vm_block_min_max_arity): return ifunc arity. * vm_eval.c (rb_lambda_call): call method with lambda block. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_4@59500 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- vm_eval.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'vm_eval.c') diff --git a/vm_eval.c b/vm_eval.c index d820f628b5..d4c3449bff 100644 --- a/vm_eval.c +++ b/vm_eval.c @@ -1203,7 +1203,7 @@ rb_iterate(VALUE (* it_proc)(VALUE), VALUE data1, VALUE (* bl_proc)(ANYARGS), VALUE data2) { return rb_iterate0(it_proc, data1, - bl_proc ? IFUNC_NEW(bl_proc, data2, rb_frame_this_func()) : 0, + bl_proc ? rb_vm_ifunc_proc_new(bl_proc, (void *)data2) : 0, GET_THREAD()); } @@ -1236,6 +1236,23 @@ rb_block_call(VALUE obj, ID mid, int argc, const VALUE * argv, return rb_iterate(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, + VALUE data2) +{ + struct iter_method_arg arg; + struct vm_ifunc *block; + + if (!bl_proc) rb_raise(rb_eArgError, "NULL lambda function"); + arg.obj = obj; + arg.mid = mid; + arg.argc = argc; + arg.argv = argv; + block = rb_vm_ifunc_new(bl_proc, (void *)data2, min_argc, max_argc); + return rb_iterate0(iterate_method, (VALUE)&arg, block, GET_THREAD()); +} + static VALUE iterate_check_method(VALUE obj) { -- cgit v1.2.3