diff options
author | Jeremy Evans <code@jeremyevans.net> | 2019-09-29 17:47:17 -0700 |
---|---|---|
committer | Jeremy Evans <code@jeremyevans.net> | 2019-09-29 18:31:08 -0700 |
commit | 649a64ae29318501472f74798a12eb60871ab990 (patch) | |
tree | 8295ea066c04d326bb7462a4f7569d60d393c5b4 /vm_eval.c | |
parent | fba8627dc1c5b191713edeb5fc21cbe0ddde9e3c (diff) |
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.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/2507
Diffstat (limited to 'vm_eval.c')
-rw-r--r-- | vm_eval.c | 33 |
1 files changed, 33 insertions, 0 deletions
@@ -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 @@ -1033,6 +1042,17 @@ rb_funcall_passing_block(VALUE recv, ID mid, int argc, const VALUE *argv) } 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) { if (!NIL_P(passed_procval)) { @@ -1279,6 +1299,19 @@ rb_yield_splat(VALUE values) } 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) { return vm_yield_force_blockarg(GET_EC(), values); |