From beae6cbf0fd8b6619e5212552de98022d4c4d4d4 Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Fri, 4 Oct 2019 12:51:57 -0700 Subject: Fully separate positional arguments and keyword arguments This removes the warnings added in 2.7, and changes the behavior so that a final positional hash is not treated as keywords or vice-versa. To handle the arg_setup_block splat case correctly with keyword arguments, we need to check if we are taking a keyword hash. That case didn't have a test, but it affects real-world code, so add a test for it. This removes rb_empty_keyword_given_p() and related code, as that is not needed in Ruby 3. The empty keyword case is the same as the no keyword case in Ruby 3. This changes rb_scan_args to implement keyword argument separation for C functions when the : character is used. For backwards compatibility, it returns a duped hash. This is a bad idea for performance, but not duping the hash breaks at least Enumerator::ArithmeticSequence#inspect. Instead of having RB_PASS_CALLED_KEYWORDS be a number, simplify the code by just making it be rb_keyword_given_p(). --- eval.c | 8 -------- 1 file changed, 8 deletions(-) (limited to 'eval.c') diff --git a/eval.c b/eval.c index 4770327a72..429ecbe0d9 100644 --- a/eval.c +++ b/eval.c @@ -924,14 +924,6 @@ rb_keyword_given_p(void) return rb_vm_cframe_keyword_p(GET_EC()->cfp); } -/* -- Remove In 3.0 -- */ -int rb_vm_cframe_empty_keyword_p(const rb_control_frame_t *cfp); -int -rb_empty_keyword_given_p(void) -{ - return rb_vm_cframe_empty_keyword_p(GET_EC()->cfp); -} - VALUE rb_eThreadError; /*! Declares that the current method needs a block. -- cgit v1.2.3