mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	vm_insnhelper.c: non-symbol key
* vm_insnhelper.c (vm_callee_setup_keyword_arg): non-symbol key is not a keyword argument, keep it as an positional argument. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40260 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									9ef4e13459
								
							
						
					
					
						commit
						2674f9a815
					
				
					 3 changed files with 44 additions and 6 deletions
				
			
		|  | @ -1,3 +1,8 @@ | |||
| Fri Apr 12 15:21:24 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org> | ||||
| 
 | ||||
| 	* vm_insnhelper.c (vm_callee_setup_keyword_arg): non-symbol key is not | ||||
| 	  a keyword argument, keep it as an positional argument. | ||||
| 
 | ||||
| Fri Apr 12 11:58:00 2013  Zachary Scott  <zachary@zacharyscott.net> | ||||
| 
 | ||||
| 	* array.c: Document synonymous methods, by windwiny [GH-277] | ||||
|  |  | |||
|  | @ -23,6 +23,7 @@ class TestKeywordArguments < Test::Unit::TestCase | |||
|   def test_f2 | ||||
|     assert_equal([:xyz, "foo", 424242], f2(:xyz)) | ||||
|     assert_raise(ArgumentError) { f2({}) } # [ruby-dev:46712] [Bug #7529] | ||||
|     assert_equal([{"bar"=>42}, "foo", 424242], f2("bar"=>42)) | ||||
|   end | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -1070,24 +1070,56 @@ vm_caller_setup_args(const rb_thread_t *th, rb_control_frame_t *cfp, rb_call_inf | |||
|     } | ||||
| } | ||||
| 
 | ||||
| static int | ||||
| separate_symbol(st_data_t key, st_data_t value, st_data_t arg) | ||||
| { | ||||
|     VALUE *kwdhash = (VALUE *)arg; | ||||
| 
 | ||||
|     if (!SYMBOL_P(key)) kwdhash++; | ||||
|     if (!*kwdhash) *kwdhash = rb_hash_new(); | ||||
|     rb_hash_aset(*kwdhash, (VALUE)key, (VALUE)value); | ||||
|     return ST_CONTINUE; | ||||
| } | ||||
| 
 | ||||
| static VALUE | ||||
| extract_keywords(VALUE *orighash) | ||||
| { | ||||
|     VALUE parthash[2] = {0, 0}; | ||||
|     VALUE hash = *orighash; | ||||
| 
 | ||||
|     if (RHASH_EMPTY_P(hash)) { | ||||
| 	*orighash = 0; | ||||
| 	return hash; | ||||
|     } | ||||
|     st_foreach(RHASH_TBL(hash), separate_symbol, (st_data_t)&parthash); | ||||
|     *orighash = parthash[1]; | ||||
|     return parthash[0]; | ||||
| } | ||||
| 
 | ||||
| static inline int | ||||
| vm_callee_setup_keyword_arg(const rb_iseq_t *iseq, int argc, VALUE *orig_argv, VALUE *kwd) | ||||
| { | ||||
|     VALUE keyword_hash; | ||||
|     VALUE keyword_hash, orig_hash; | ||||
|     int i, j; | ||||
| 
 | ||||
|     if (argc > 0 && | ||||
| 	!NIL_P(keyword_hash = rb_check_hash_type(orig_argv[argc-1]))) { | ||||
| 	argc--; | ||||
| 	keyword_hash = rb_hash_dup(keyword_hash); | ||||
| 	!NIL_P(orig_hash = rb_check_hash_type(orig_argv[argc-1])) && | ||||
| 	(keyword_hash = extract_keywords(&orig_hash)) != 0) { | ||||
| 	if (!orig_hash) { | ||||
| 	    argc--; | ||||
| 	} | ||||
| 	else { | ||||
| 	    orig_argv[argc-1] = orig_hash; | ||||
| 	} | ||||
| 	i = 0; | ||||
| 	if (iseq->arg_keyword_required) { | ||||
| 	    VALUE missing = Qnil; | ||||
| 	    for (; i < iseq->arg_keyword_required; i++) { | ||||
| 		if (st_lookup(RHASH_TBL(keyword_hash), ID2SYM(iseq->arg_keyword_table[i]), 0)) | ||||
| 		VALUE keyword = ID2SYM(iseq->arg_keyword_table[i]); | ||||
| 		if (st_lookup(RHASH_TBL(keyword_hash), (st_data_t)keyword, 0)) | ||||
| 		    continue; | ||||
| 		if (NIL_P(missing)) missing = rb_ary_tmp_new(1); | ||||
| 		rb_ary_push(missing, ID2SYM(iseq->arg_keyword_table[i])); | ||||
| 		rb_ary_push(missing, keyword); | ||||
| 	    } | ||||
| 	    if (!NIL_P(missing)) { | ||||
| 		keyword_error("missing", missing); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 nobu
						nobu