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(). --- ext/-test-/scan_args/scan_args.c | 10 ---------- 1 file changed, 10 deletions(-) (limited to 'ext/-test-') diff --git a/ext/-test-/scan_args/scan_args.c b/ext/-test-/scan_args/scan_args.c index 9c374da66f..8696aad3c7 100644 --- a/ext/-test-/scan_args/scan_args.c +++ b/ext/-test-/scan_args/scan_args.c @@ -259,15 +259,6 @@ scan_args_k_lead_opt_hash(int argc, VALUE *argv, VALUE self) return rb_ary_new_from_values(numberof(args), args); } -static VALUE -scan_args_e_lead_opt_hash(int argc, VALUE *argv, VALUE self) -{ - VALUE args[4]; - int n = rb_scan_args_kw(RB_SCAN_ARGS_EMPTY_KEYWORDS, argc, argv, "11:", args+1, args+2, args+3); - args[0] = INT2NUM(n); - return rb_ary_new_from_values(numberof(args), args); -} - static VALUE scan_args_n_lead_opt_hash(int argc, VALUE *argv, VALUE self) { @@ -310,6 +301,5 @@ Init_scan_args(void) rb_define_singleton_method(module, "opt_var_trail_hash", scan_args_opt_var_trail_hash, -1); rb_define_singleton_method(module, "lead_opt_var_trail_hash", scan_args_lead_opt_var_trail_hash, -1); rb_define_singleton_method(module, "k_lead_opt_hash", scan_args_k_lead_opt_hash, -1); - rb_define_singleton_method(module, "e_lead_opt_hash", scan_args_e_lead_opt_hash, -1); rb_define_singleton_method(module, "n_lead_opt_hash", scan_args_n_lead_opt_hash, -1); } -- cgit v1.2.3