From 15757390fff14071f3d77fa75934b741723eb92a Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Sat, 31 Aug 2019 21:51:02 -0700 Subject: Don't pass an empty keyword hash when double splatting empty hash when calling cfunc This mirrors earlier changes in keyword argument separation for calling Ruby methods and calling procs/lambdas, so that behavior is kept the same. --- vm_insnhelper.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'vm_insnhelper.c') diff --git a/vm_insnhelper.c b/vm_insnhelper.c index 71c5930b2e..ae39472b54 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -2186,6 +2186,13 @@ vm_call_cfunc_with_frame(rb_execution_context_t *ec, rb_control_frame_t *reg_cfp VALUE recv = calling->recv; VALUE block_handler = calling->block_handler; int argc = calling->argc; + int orig_argc = argc; + + if (UNLIKELY(IS_ARGS_KW_SPLAT(ci))) { + if (RHASH_EMPTY_P(*(GET_SP()-1))) { + argc--; + } + } RUBY_DTRACE_CMETHOD_ENTRY_HOOK(ec, me->owner, me->def->original_id); EXEC_EVENT_HOOK(ec, RUBY_EVENT_C_CALL, recv, me->def->original_id, ci->mid, me->owner, Qundef); @@ -2196,7 +2203,7 @@ vm_call_cfunc_with_frame(rb_execution_context_t *ec, rb_control_frame_t *reg_cfp if (len >= 0) rb_check_arity(argc, len, len); - reg_cfp->sp -= argc + 1; + reg_cfp->sp -= orig_argc + 1; val = (*cfunc->invoker)(recv, argc, reg_cfp->sp + 1, cfunc->func); CHECK_CFP_CONSISTENCY("vm_call_cfunc"); -- cgit v1.2.3