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