diff options
author | Jeremy Evans <code@jeremyevans.net> | 2019-09-17 14:32:19 -0700 |
---|---|---|
committer | Jeremy Evans <code@jeremyevans.net> | 2019-09-17 16:22:44 -0700 |
commit | 775365cbd2bf17195e694771fc1c15698273a640 (patch) | |
tree | ffed420e45f7a91d203acf2a22ac66650af4e214 /vm_eval.c | |
parent | 9b35dc38644c10eed008f9ba19a7224f2fb49af2 (diff) |
Fix keyword argument separation issues with sym procs when using refinements
Make sure that vm_yield_with_cfunc can correctly set the empty keyword
flag by passing 2 as the kw_splat value when calling it in
vm_invoke_ifunc_block. Make sure calling.kw_splat is set to 1 and not
128 in vm_sendish, so we can safely check for different kw_splat values.
vm_args.c needs to call add_empty_keyword, and to make JIT happy, the
function needs to be exported. Rename the function to
rb_adjust_argv_kw_splat to more accurately reflect what it does, and
mark it as MJIT exported.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/2462
Diffstat (limited to 'vm_eval.c')
-rw-r--r-- | vm_eval.c | 14 |
1 files changed, 7 insertions, 7 deletions
@@ -236,8 +236,8 @@ vm_call0_body(rb_execution_context_t *ec, struct rb_calling_info *calling, const } /* Caller should keep the reference to the return value until argv becomes useless. */ -static VALUE -add_empty_keyword(int *argc, const VALUE **argv, int *kw_splat) +MJIT_FUNC_EXPORTED VALUE +rb_adjust_argv_kw_splat(int *argc, const VALUE **argv, int *kw_splat) { if (*kw_splat == RB_PASS_CALLED_KEYWORDS || *kw_splat == RB_PASS_EMPTY_KEYWORDS) { if (*kw_splat == RB_PASS_EMPTY_KEYWORDS || rb_empty_keyword_given_p()) { @@ -273,7 +273,7 @@ rb_vm_call(rb_execution_context_t *ec, VALUE recv, VALUE id, int argc, const VAL VALUE rb_vm_call_kw(rb_execution_context_t *ec, VALUE recv, VALUE id, int argc, const VALUE *argv, const rb_callable_method_entry_t *me, int kw_splat) { - VALUE v = add_empty_keyword(&argc, &argv, &kw_splat); + VALUE v = rb_adjust_argv_kw_splat(&argc, &argv, &kw_splat); VALUE ret = rb_vm_call0(ec, recv, id, argc, argv, me, kw_splat); rb_free_tmp_buffer(&v); return ret; @@ -298,7 +298,7 @@ vm_call_super(rb_execution_context_t *ec, int argc, const VALUE *argv, int kw_sp id = me->def->original_id; me = rb_callable_method_entry(klass, id); - v = add_empty_keyword(&argc, &argv, &kw_splat); + v = rb_adjust_argv_kw_splat(&argc, &argv, &kw_splat); if (!me) { ret = method_missing(recv, id, argc, argv, MISSING_SUPER, kw_splat); } @@ -953,7 +953,7 @@ rb_funcallv(VALUE recv, ID mid, int argc, const VALUE *argv) VALUE rb_funcallv_kw(VALUE recv, ID mid, int argc, const VALUE *argv, int kw_splat) { - VALUE v = add_empty_keyword(&argc, &argv, &kw_splat); + VALUE v = rb_adjust_argv_kw_splat(&argc, &argv, &kw_splat); VALUE ret = rb_call(recv, mid, argc, argv, kw_splat ? CALL_FCALL_KW : CALL_FCALL); rb_free_tmp_buffer(&v); return ret; @@ -1023,7 +1023,7 @@ rb_funcall_with_block_kw(VALUE recv, ID mid, int argc, const VALUE *argv, VALUE vm_passed_block_handler_set(GET_EC(), passed_procval); } - VALUE v = add_empty_keyword(&argc, &argv, &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; @@ -1390,7 +1390,7 @@ rb_block_call_kw(VALUE obj, ID mid, int argc, const VALUE * argv, { struct iter_method_arg arg; - VALUE v = add_empty_keyword(&argc, &argv, &kw_splat); + VALUE v = rb_adjust_argv_kw_splat(&argc, &argv, &kw_splat); arg.obj = obj; arg.mid = mid; arg.argc = argc; |