[前][次][番号順一覧][スレッド一覧]

ruby-changes:28940

From: mame <ko1@a...>
Date: Thu, 30 May 2013 19:50:52 +0900 (JST)
Subject: [ruby-changes:28940] mame:r40992 (trunk): * vm_insnhelper.c (vm_callee_setup_keyword_arg,

mame	2013-05-30 19:50:41 +0900 (Thu, 30 May 2013)

  New Revision: 40992

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=40992

  Log:
    * vm_insnhelper.c (vm_callee_setup_keyword_arg,
      vm_callee_setup_arg_complex): consider a hash argument for keyword
      only when the number of arguments is more than the expected
      mandatory parameters.  [ruby-core:53199] [ruby-trunk - Bug #8040]
    
    * test/ruby/test_keyword.rb: update a test for above.

  Modified files:
    trunk/ChangeLog
    trunk/test/ruby/test_keyword.rb
    trunk/vm_insnhelper.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 40991)
+++ ChangeLog	(revision 40992)
@@ -1,3 +1,12 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Thu May 30 19:47:42 2013  Yusuke Endoh  <mame@t...>
+
+	* vm_insnhelper.c (vm_callee_setup_keyword_arg,
+	  vm_callee_setup_arg_complex): consider a hash argument for keyword
+	  only when the number of arguments is more than the expected
+	  mandatory parameters.  [ruby-core:53199] [ruby-trunk - Bug #8040]
+
+	* test/ruby/test_keyword.rb: update a test for above.
+
 Thu May 30 17:55:04 2013  Zachary Scott  <zachary@z...>
 
 	* process.c: RDoc on Process.spawn
Index: vm_insnhelper.c
===================================================================
--- vm_insnhelper.c	(revision 40991)
+++ vm_insnhelper.c	(revision 40992)
@@ -1097,12 +1097,12 @@ extract_keywords(VALUE *orighash) https://github.com/ruby/ruby/blob/trunk/vm_insnhelper.c#L1097
 }
 
 static inline int
-vm_callee_setup_keyword_arg(const rb_iseq_t *iseq, int argc, VALUE *orig_argv, VALUE *kwd)
+vm_callee_setup_keyword_arg(const rb_iseq_t *iseq, int argc, int m, VALUE *orig_argv, VALUE *kwd)
 {
     VALUE keyword_hash, orig_hash;
     int i, j;
 
-    if (argc > 0 &&
+    if (argc > m &&
 	!NIL_P(orig_hash = rb_check_hash_type(orig_argv[argc-1])) &&
 	(keyword_hash = extract_keywords(&orig_hash)) != 0) {
 	if (!orig_hash) {
@@ -1167,7 +1167,7 @@ vm_callee_setup_arg_complex(rb_thread_t https://github.com/ruby/ruby/blob/trunk/vm_insnhelper.c#L1167
 
     /* keyword argument */
     if (iseq->arg_keyword != -1) {
-	argc = vm_callee_setup_keyword_arg(iseq, argc, orig_argv, &keyword_hash);
+	argc = vm_callee_setup_keyword_arg(iseq, argc, m, orig_argv, &keyword_hash);
     }
 
     /* mandatory */
@@ -2195,7 +2195,7 @@ vm_yield_setup_block_args(rb_thread_t *t https://github.com/ruby/ruby/blob/trunk/vm_insnhelper.c#L2195
 
     /* keyword argument */
     if (iseq->arg_keyword != -1) {
-	argc = vm_callee_setup_keyword_arg(iseq, argc, argv, &keyword_hash);
+	argc = vm_callee_setup_keyword_arg(iseq, argc, m, argv, &keyword_hash);
     }
 
     /*
Index: test/ruby/test_keyword.rb
===================================================================
--- test/ruby/test_keyword.rb	(revision 40991)
+++ test/ruby/test_keyword.rb	(revision 40992)
@@ -22,7 +22,6 @@ class TestKeywordArguments < Test::Unit: https://github.com/ruby/ruby/blob/trunk/test/ruby/test_keyword.rb#L22
 
   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
 
@@ -379,4 +378,15 @@ class TestKeywordArguments < Test::Unit: https://github.com/ruby/ruby/blob/trunk/test/ruby/test_keyword.rb#L378
     end
     assert_equal({:bar=>"x"}, a.new.foo(bar: "x"), bug8416)
   end
+
+  def test_precedence_of_keyword_arguments
+    bug8040 = '[ruby-core:53199] [Bug #8040]'
+    a = Class.new do
+      def foo(x, **h)
+        [x, h]
+      end
+    end
+    assert_equal([{}, {}], a.new.foo({}))
+    assert_equal([{}, {:bar=>"x"}], a.new.foo({}, bar: "x"))
+  end
 end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]