diff options
Diffstat (limited to 'vm_eval.c')
-rw-r--r-- | vm_eval.c | 20 |
1 files changed, 19 insertions, 1 deletions
@@ -1277,6 +1277,7 @@ struct iter_method_arg { ID mid; int argc; const VALUE *argv; + int kw_splat; }; static VALUE @@ -1285,7 +1286,7 @@ iterate_method(VALUE obj) const struct iter_method_arg * arg = (struct iter_method_arg *) obj; - return rb_call(arg->obj, arg->mid, arg->argc, arg->argv, CALL_FCALL); + return rb_call(arg->obj, arg->mid, arg->argc, arg->argv, arg->kw_splat ? CALL_FCALL_KW : CALL_FCALL); } VALUE @@ -1298,6 +1299,21 @@ rb_block_call(VALUE obj, ID mid, int argc, const VALUE * argv, arg.mid = mid; arg.argc = argc; arg.argv = argv; + arg.kw_splat = 0; + return rb_iterate(iterate_method, (VALUE)&arg, bl_proc, data2); +} + +VALUE +rb_block_call_kw(VALUE obj, ID mid, int argc, const VALUE * argv, + rb_block_call_func_t bl_proc, VALUE data2, int kw_splat) +{ + struct iter_method_arg arg; + + arg.obj = obj; + arg.mid = mid; + arg.argc = argc; + arg.argv = argv; + arg.kw_splat = kw_splat; return rb_iterate(iterate_method, (VALUE)&arg, bl_proc, data2); } @@ -1314,6 +1330,7 @@ rb_lambda_call(VALUE obj, ID mid, int argc, const VALUE *argv, arg.mid = mid; arg.argc = argc; arg.argv = argv; + arg.kw_splat = 0; block = rb_vm_ifunc_new(bl_proc, (void *)data2, min_argc, max_argc); return rb_iterate0(iterate_method, (VALUE)&arg, block, GET_EC()); } @@ -1337,6 +1354,7 @@ rb_check_block_call(VALUE obj, ID mid, int argc, const VALUE *argv, arg.mid = mid; arg.argc = argc; arg.argv = argv; + arg.kw_splat = 0; return rb_iterate(iterate_check_method, (VALUE)&arg, bl_proc, data2); } |