aboutsummaryrefslogtreecommitdiffstats
path: root/vm_insnhelper.c
diff options
context:
space:
mode:
authorJeremy Evans <code@jeremyevans.net>2019-08-31 21:51:02 -0700
committerJeremy Evans <code@jeremyevans.net>2019-08-31 21:54:06 -0700
commit15757390fff14071f3d77fa75934b741723eb92a (patch)
tree32eb4d807c449352db7d7a246277b00063662ef9 /vm_insnhelper.c
parente80a6f65c873fb01c98f71fa94085264dbb1dbf0 (diff)
downloadruby-15757390fff14071f3d77fa75934b741723eb92a.tar.gz
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.c9
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");