diff options
author | Jeremy Evans <code@jeremyevans.net> | 2019-08-31 21:51:02 -0700 |
---|---|---|
committer | Jeremy Evans <code@jeremyevans.net> | 2019-08-31 21:54:06 -0700 |
commit | 15757390fff14071f3d77fa75934b741723eb92a (patch) | |
tree | 32eb4d807c449352db7d7a246277b00063662ef9 /vm_insnhelper.c | |
parent | e80a6f65c873fb01c98f71fa94085264dbb1dbf0 (diff) |
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.
Diffstat (limited to 'vm_insnhelper.c')
-rw-r--r-- | vm_insnhelper.c | 9 |
1 files changed, 8 insertions, 1 deletions
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"); |