From 649a64ae29318501472f74798a12eb60871ab990 Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Sun, 29 Sep 2019 17:47:17 -0700 Subject: Add three more C-API functions for handling keywords This adds rb_funcall_passing_block_kw, rb_funcallv_public_kw, and rb_yield_splat_kw. This functions are necessary to easily handle cases where rb_funcall_passing_block, rb_funcallv_public, and rb_yield_splat are currently used and a keyword argument separation warning is raised. --- vm_eval.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'vm_eval.c') diff --git a/vm_eval.c b/vm_eval.c index f6a1cc035e..c741773657 100644 --- a/vm_eval.c +++ b/vm_eval.c @@ -989,6 +989,15 @@ rb_funcallv_public(VALUE recv, ID mid, int argc, const VALUE *argv) return rb_call(recv, mid, argc, argv, CALL_PUBLIC); } +VALUE +rb_funcallv_public_kw(VALUE recv, ID mid, int argc, const VALUE *argv, int kw_splat) +{ + VALUE v = rb_adjust_argv_kw_splat(&argc, &argv, &kw_splat); + VALUE ret = rb_call(recv, mid, argc, argv, kw_splat ? CALL_PUBLIC_KW : CALL_PUBLIC); + rb_free_tmp_buffer(&v); + return ret; +} + /*! * Calls a method * \private @@ -1032,6 +1041,17 @@ rb_funcall_passing_block(VALUE recv, ID mid, int argc, const VALUE *argv) return rb_call(recv, mid, argc, argv, CALL_PUBLIC); } +VALUE +rb_funcall_passing_block_kw(VALUE recv, ID mid, int argc, const VALUE *argv, int kw_splat) +{ + VALUE v = rb_adjust_argv_kw_splat(&argc, &argv, &kw_splat); + VALUE ret; + PASS_PASSED_BLOCK_HANDLER(); + ret = rb_call(recv, mid, argc, argv, kw_splat ? CALL_PUBLIC_KW : CALL_PUBLIC); + rb_free_tmp_buffer(&v); + return ret; +} + VALUE rb_funcall_with_block(VALUE recv, ID mid, int argc, const VALUE *argv, VALUE passed_procval) { @@ -1278,6 +1298,19 @@ rb_yield_splat(VALUE values) return v; } +VALUE +rb_yield_splat_kw(VALUE values, int kw_splat) +{ + VALUE tmp = rb_check_array_type(values); + VALUE v; + if (NIL_P(tmp)) { + rb_raise(rb_eArgError, "not an array"); + } + v = rb_yield_0_kw(RARRAY_LENINT(tmp), RARRAY_CONST_PTR(tmp), kw_splat); + RB_GC_GUARD(tmp); + return v; +} + VALUE rb_yield_force_blockarg(VALUE values) { -- cgit v1.2.3