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

ruby-changes:2571

From: ko1@a...
Date: 1 Dec 2007 13:30:53 +0900
Subject: [ruby-changes:2571] ko1 - Ruby:r14062 (trunk): * insnhelper.ci (vm_yield_with_cfunc): fix to passing argc on third

ko1	2007-12-01 13:30:19 +0900 (Sat, 01 Dec 2007)

  New Revision: 14062

  Modified files:
    trunk/ChangeLog
    trunk/bootstraptest/test_block.rb
    trunk/bootstraptest/test_knownbug.rb
    trunk/enumerator.c
    trunk/eval.c
    trunk/include/ruby/ruby.h
    trunk/insnhelper.ci

  Log:
    * insnhelper.ci (vm_yield_with_cfunc): fix to passing argc on third
      parameter of IFUNC.  [ruby-dev:32329]
    * enumerator.c: fix to pass exact number of argument.
    * eval.c (rb_yield_values2): added.
    * include/ruby/ruby.h: ditto.
    * bootstraptest/test_knownbug.rb: move a fixed test.
    * bootstraptest/test_block.rb: ditto.
    


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/insnhelper.ci?r1=14062&r2=14061
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/include/ruby/ruby.h?r1=14062&r2=14061
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/bootstraptest/test_block.rb?r1=14062&r2=14061
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=14062&r2=14061
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/eval.c?r1=14062&r2=14061
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/enumerator.c?r1=14062&r2=14061
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/bootstraptest/test_knownbug.rb?r1=14062&r2=14061

Index: include/ruby/ruby.h
===================================================================
--- include/ruby/ruby.h	(revision 14061)
+++ include/ruby/ruby.h	(revision 14062)
@@ -772,6 +772,7 @@
 VALUE rb_each(VALUE);
 VALUE rb_yield(VALUE);
 VALUE rb_yield_values(int n, ...);
+VALUE rb_yield_values2(int n, VALUE *argv);
 VALUE rb_yield_splat(VALUE);
 int rb_block_given_p(void);
 void rb_need_block(void);
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 14061)
+++ ChangeLog	(revision 14062)
@@ -1,3 +1,18 @@
+Sat Dec  1 13:24:47 2007  Koichi Sasada  <ko1@a...>
+
+	* insnhelper.ci (vm_yield_with_cfunc): fix to passing argc on third
+	  parameter of IFUNC.  [ruby-dev:32329]
+
+	* enumerator.c: fix to pass exact number of argument.
+
+	* eval.c (rb_yield_values2): added.
+
+	* include/ruby/ruby.h: ditto.
+
+	* bootstraptest/test_knownbug.rb: move a fixed test.
+
+	* bootstraptest/test_block.rb: ditto.
+
 Sat Dec  1 03:34:32 2007  Nobuyoshi Nakada  <nobu@r...>
 
 	* parse.y (newline_node): always remove NODE_BEGIN.
Index: enumerator.c
===================================================================
--- enumerator.c	(revision 14061)
+++ enumerator.c	(revision 14062)
@@ -36,7 +36,7 @@
 }
 
 struct enumerator;
-typedef VALUE enum_iter(VALUE, struct enumerator *);
+typedef VALUE enum_iter(VALUE, struct enumerator *, VALUE);
 
 struct enumerator {
     VALUE method;
@@ -77,7 +77,7 @@
 }
 
 static VALUE
-enumerator_iter_i(VALUE i, struct enumerator *e)
+enumerator_iter_i(VALUE i, struct enumerator *e, VALUE argc)
 {
     return rb_yield(proc_call(e->proc, i));
 }
@@ -225,6 +225,17 @@
 }
 
 static VALUE
+enumerator_each_i(VALUE v, VALUE enum_obj, VALUE argc)
+{
+    if (argc == 1) {
+	return rb_yield(v);
+    }
+    else {
+	return rb_yield_values2(argc, RARRAY_PTR(v));
+    }
+}
+
+static VALUE
 enumerator_init(VALUE enum_obj, VALUE obj, VALUE meth, int argc, VALUE *argv)
 {
     struct enumerator *ptr = enumerator_ptr(enum_obj);
@@ -235,7 +246,7 @@
 	ptr->iter = enumerator_iter_i;
     }
     else {
-	ptr->iter = (enum_iter *)rb_yield;
+	ptr->iter = (enum_iter *)enumerator_each_i;
     }
     if (argc) ptr->args = rb_ary_new4(argc, argv);
     ptr->fib = 0;
Index: bootstraptest/test_knownbug.rb
===================================================================
--- bootstraptest/test_knownbug.rb	(revision 14061)
+++ bootstraptest/test_knownbug.rb	(revision 14062)
@@ -10,20 +10,6 @@
   YAML.load("2000-01-01 00:00:00.#{"0"*1000} +00:00\n")
 }, '[ruby-core:13735]'
 
-assert_equal 'ok', %q{
-  class C
-    def each
-      yield [1,2]
-      yield 1,2
-    end
-  end
-  vs1 = []
-  C.new.each {|*v| vs1 << v }
-  vs2 = []               
-  C.new.to_enum.each {|*v| vs2 << v }
-  vs1 == vs2 ? :ok : :ng
-}, '[ruby-dev:32329]'
-
 assert_equal '..f00000000', %q{
   sprintf("%x", -2**32)
 }, '[ruby-dev:32351]'
Index: bootstraptest/test_block.rb
===================================================================
--- bootstraptest/test_block.rb	(revision 14061)
+++ bootstraptest/test_block.rb	(revision 14062)
@@ -441,4 +441,17 @@
     :ng
   end
 }, '[ruby-dev:31472]'
+assert_equal 'ok', %q{
+  class C
+    def each
+      yield [1,2]
+      yield 1,2
+    end
+  end
+  vs1 = []
+  C.new.each {|*v| vs1 << v }
+  vs2 = []               
+  C.new.to_enum.each {|*v| vs2 << v }
+  vs1 == vs2 ? :ok : :ng
+}, '[ruby-dev:32329]'
 
Index: eval.c
===================================================================
--- eval.c	(revision 14061)
+++ eval.c	(revision 14062)
@@ -953,6 +953,12 @@
 }
 
 VALUE
+rb_yield_values2(int argc, VALUE *argv)
+{
+    return rb_yield_0(argc, argv);
+}
+
+VALUE
 rb_yield_splat(VALUE values)
 {
     VALUE tmp = rb_check_array_type(values);
Index: insnhelper.ci
===================================================================
--- insnhelper.ci	(revision 14061)
+++ insnhelper.ci	(revision 14062)
@@ -661,7 +661,7 @@
 		  self, (VALUE)block->dfp,
 		  0, th->cfp->sp, block->lfp, 1);
 
-    val = (*ifunc->nd_cfnc) (arg, ifunc->nd_tval, Qnil);
+    val = (*ifunc->nd_cfnc) (arg, ifunc->nd_tval, (VALUE) argc);
 
     th->cfp++;
     return val;

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

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