diff options
author | Jeremy Evans <code@jeremyevans.net> | 2019-09-04 15:47:53 -0700 |
---|---|---|
committer | Jeremy Evans <code@jeremyevans.net> | 2019-09-05 17:47:12 -0700 |
commit | 1fffd33189ddb4dfdefe2ada09ec884f89e305ce (patch) | |
tree | 23c4f0ef103d26cd8f3c87e5970a71cf3b010fee /vm_insnhelper.c | |
parent | 6f9b86616a8ad60cfed2979e2a0f8398a12e7c85 (diff) |
Fix passing keywords without splats to sym procs, define_method, and method_missing
Diffstat (limited to 'vm_insnhelper.c')
-rw-r--r-- | vm_insnhelper.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/vm_insnhelper.c b/vm_insnhelper.c index 57300073d2..593804b930 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -2255,7 +2255,7 @@ vm_call_bmethod_body(rb_execution_context_t *ec, struct rb_calling_info *calling /* control block frame */ GetProcPtr(cc->me->def->body.bmethod.proc, proc); - val = rb_vm_invoke_bmethod(ec, proc, calling->recv, calling->argc, argv, calling->kw_splat, calling->block_handler, cc->me); + val = rb_vm_invoke_bmethod(ec, proc, calling->recv, calling->argc, argv, calling->kw_splat || (ci->flag & (VM_CALL_KWARG | VM_CALL_KW_SPLAT)), calling->block_handler, cc->me); return val; } @@ -2412,7 +2412,8 @@ vm_call_method_missing(rb_execution_context_t *ec, rb_control_frame_t *reg_cfp, CALLER_SETUP_ARG(reg_cfp, calling, orig_ci, 0); argc = calling->argc+1; - ci_entry.flag = VM_CALL_FCALL | VM_CALL_OPT_SEND | (orig_ci->flag & VM_CALL_KW_SPLAT); + ci_entry.flag = VM_CALL_FCALL | VM_CALL_OPT_SEND | + (orig_ci->flag & (VM_CALL_KW_SPLAT |VM_CALL_KWARG) ? VM_CALL_KW_SPLAT : 0); ci_entry.mid = idMethodMissing; ci_entry.orig_argc = argc; ci = &ci_entry; @@ -3015,7 +3016,7 @@ vm_invoke_symbol_block(rb_execution_context_t *ec, rb_control_frame_t *reg_cfp, int argc; CALLER_SETUP_ARG(ec->cfp, calling, ci, 0); argc = calling->argc; - val = vm_yield_with_symbol(ec, symbol, argc, STACK_ADDR_FROM_TOP(argc), calling->kw_splat, calling->block_handler); + val = vm_yield_with_symbol(ec, symbol, argc, STACK_ADDR_FROM_TOP(argc), calling->kw_splat || (ci->flag & (VM_CALL_KWARG | VM_CALL_KW_SPLAT)), calling->block_handler); POPN(argc); return val; } |