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