mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	Add back checks for empty kw splat with tests (#4405)
This reverts commit a224ce8150.
Turns out the checks are needed to handle splatting an array with an
empty ruby2 keywords hash.
			
			
This commit is contained in:
		
							parent
							
								
									1f2b5c6dfe
								
							
						
					
					
						commit
						dee58d7ae7
					
				
				
				Notes:
				
					git
				
				2021-04-24 11:17:41 +09:00 
				
			
			Merged-By: XrXr
					 2 changed files with 22 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -2411,6 +2411,13 @@ class TestKeywordArguments < Test::Unit::TestCase
 | 
			
		|||
        args
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def empty_method
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def opt(arg = :opt)
 | 
			
		||||
        arg
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      ruby2_keywords def foo_dbar(*args)
 | 
			
		||||
        dbar(*args)
 | 
			
		||||
      end
 | 
			
		||||
| 
						 | 
				
			
			@ -2419,6 +2426,16 @@ class TestKeywordArguments < Test::Unit::TestCase
 | 
			
		|||
        dbaz(*args)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      ruby2_keywords def clear_last_empty_method(*args)
 | 
			
		||||
        args.last.clear
 | 
			
		||||
        empty_method(*args)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      ruby2_keywords def clear_last_opt(*args)
 | 
			
		||||
        args.last.clear
 | 
			
		||||
        opt(*args)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      define_method(:dbar) do |*args, **kw|
 | 
			
		||||
        [args, kw]
 | 
			
		||||
      end
 | 
			
		||||
| 
						 | 
				
			
			@ -2653,6 +2670,9 @@ class TestKeywordArguments < Test::Unit::TestCase
 | 
			
		|||
    assert_equal([[1, h1], {}], o.foo(:pass_bar, 1, :a=>1))
 | 
			
		||||
    assert_equal([[1, h1], {}], o.foo(:pass_cfunc, 1, :a=>1))
 | 
			
		||||
 | 
			
		||||
    assert_equal(:opt, o.clear_last_opt(a: 1))
 | 
			
		||||
    assert_nothing_raised(ArgumentError) { o.clear_last_empty_method(a: 1) }
 | 
			
		||||
 | 
			
		||||
    assert_warn(/Skipping set of ruby2_keywords flag for bar \(method accepts keywords or method does not accept argument splat\)/) do
 | 
			
		||||
      assert_nil(c.send(:ruby2_keywords, :bar))
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2412,6 +2412,7 @@ vm_callee_setup_arg(rb_execution_context_t *ec, struct rb_calling_info *calling,
 | 
			
		|||
        if (LIKELY(rb_simple_iseq_p(iseq))) {
 | 
			
		||||
            rb_control_frame_t *cfp = ec->cfp;
 | 
			
		||||
            CALLER_SETUP_ARG(cfp, calling, ci);
 | 
			
		||||
            CALLER_REMOVE_EMPTY_KW_SPLAT(cfp, calling, ci);
 | 
			
		||||
 | 
			
		||||
            if (calling->argc != iseq->body->param.lead_num) {
 | 
			
		||||
                argument_arity_error(ec, iseq, calling->argc, iseq->body->param.lead_num, iseq->body->param.lead_num);
 | 
			
		||||
| 
						 | 
				
			
			@ -2425,6 +2426,7 @@ vm_callee_setup_arg(rb_execution_context_t *ec, struct rb_calling_info *calling,
 | 
			
		|||
        else if (rb_iseq_only_optparam_p(iseq)) {
 | 
			
		||||
            rb_control_frame_t *cfp = ec->cfp;
 | 
			
		||||
            CALLER_SETUP_ARG(cfp, calling, ci);
 | 
			
		||||
            CALLER_REMOVE_EMPTY_KW_SPLAT(cfp, calling, ci);
 | 
			
		||||
 | 
			
		||||
            const int lead_num = iseq->body->param.lead_num;
 | 
			
		||||
            const int opt_num = iseq->body->param.opt_num;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue