ruby-changes:31848
From: nobu <ko1@a...>
Date: Sat, 30 Nov 2013 13:21:36 +0900 (JST)
Subject: [ruby-changes:31848] nobu:r43927 (trunk): vm_eval.c: blockarg
nobu 2013-11-30 13:21:26 +0900 (Sat, 30 Nov 2013) New Revision: 43927 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=43927 Log: vm_eval.c: blockarg * vm_eval.c (rb_yield_block): implement non-nil block argument. Added files: trunk/ext/-test-/iter/init.c trunk/ext/-test-/iter/yield.c trunk/test/-ext-/iter/test_yield_block.rb Modified files: trunk/ChangeLog trunk/ext/-test-/iter/break.c trunk/ext/-test-/iter/extconf.rb trunk/test/-ext-/iter/test_iter_break.rb trunk/vm_eval.c Index: ChangeLog =================================================================== --- ChangeLog (revision 43926) +++ ChangeLog (revision 43927) @@ -1,3 +1,7 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 +Sat Nov 30 13:21:15 2013 Nobuyoshi Nakada <nobu@r...> + + * vm_eval.c (rb_yield_block): implement non-nil block argument. + Fri Nov 29 20:59:39 2013 Masaya Tarui <tarui@r...> * vm_dump.c (rb_vmdebug_debug_print_pre): Bugfix. Get PC directly. Index: vm_eval.c =================================================================== --- vm_eval.c (revision 43926) +++ vm_eval.c (revision 43927) @@ -994,7 +994,9 @@ rb_yield_block(VALUE val, VALUE arg, int https://github.com/ruby/ruby/blob/trunk/vm_eval.c#L994 { const rb_block_t *blockptr = 0; if (!NIL_P(blockarg)) { - rb_notimplement(); + rb_proc_t *blockproc; + GetProcPtr(blockarg, blockproc); + blockptr = &blockproc->block; } return vm_yield_with_block(GET_THREAD(), argc, argv, blockptr); } Index: ext/-test-/iter/init.c =================================================================== --- ext/-test-/iter/init.c (revision 0) +++ ext/-test-/iter/init.c (revision 43927) @@ -0,0 +1,11 @@ https://github.com/ruby/ruby/blob/trunk/ext/-test-/iter/init.c#L1 +#include "ruby.h" + +#define init(n) {void Init_##n(VALUE klass); Init_##n(klass);} + +void +Init_iter(void) +{ + VALUE mBug = rb_define_module("Bug"); + VALUE klass = rb_define_module_under(mBug, "Iter"); + TEST_INIT_FUNCS(init); +} Property changes on: ext/-test-/iter/init.c ___________________________________________________________________ Added: svn:eol-style + LF Index: ext/-test-/iter/break.c =================================================================== --- ext/-test-/iter/break.c (revision 43926) +++ ext/-test-/iter/break.c (revision 43927) @@ -17,9 +17,9 @@ iter_break_value(VALUE self, VALUE val) https://github.com/ruby/ruby/blob/trunk/ext/-test-/iter/break.c#L17 } void -Init_break(void) +Init_break(VALUE klass) { - VALUE breakable = rb_define_module_under(rb_define_module("Bug"), "Breakable"); + VALUE breakable = rb_define_module_under(klass, "Breakable"); rb_define_module_function(breakable, "iter_break", iter_break, 0); rb_define_module_function(breakable, "iter_break_value", iter_break_value, 1); } Index: ext/-test-/iter/yield.c =================================================================== --- ext/-test-/iter/yield.c (revision 0) +++ ext/-test-/iter/yield.c (revision 43927) @@ -0,0 +1,16 @@ https://github.com/ruby/ruby/blob/trunk/ext/-test-/iter/yield.c#L1 +#include <ruby.h> + +static VALUE +yield_block(int argc, VALUE *argv, VALUE self) +{ + rb_check_arity(argc, 1, UNLIMITED_ARGUMENTS); + return rb_block_call(self, rb_to_id(argv[0]), argc-1, argv+1, rb_yield_block, 0); +} + +void +Init_yield(VALUE klass) +{ + VALUE yield = rb_define_module_under(klass, "Yield"); + + rb_define_method(yield, "yield_block", yield_block, -1); +} Property changes on: ext/-test-/iter/yield.c ___________________________________________________________________ Added: svn:eol-style + LF Index: ext/-test-/iter/extconf.rb =================================================================== --- ext/-test-/iter/extconf.rb (revision 43926) +++ ext/-test-/iter/extconf.rb (revision 43927) @@ -1 +1,7 @@ -create_makefile("-test-/iter/break") +$INCFLAGS << " -I$(topdir) -I$(top_srcdir)" +$srcs = Dir[File.join($srcdir, "*.{#{SRC_EXT.join(%q{,})}}")] +inits = $srcs.map {|s| File.basename(s, ".*")} +inits.delete("init") +inits.map! {|s|"X(#{s})"} +$defs << "-DTEST_INIT_FUNCS(X)=\"#{inits.join(' ')}\"" +create_makefile("-test-/iter") Index: test/-ext-/iter/test_yield_block.rb =================================================================== --- test/-ext-/iter/test_yield_block.rb (revision 0) +++ test/-ext-/iter/test_yield_block.rb (revision 43927) @@ -0,0 +1,21 @@ https://github.com/ruby/ruby/blob/trunk/test/-ext-/iter/test_yield_block.rb#L1 +require 'test/unit' +require '-test-/iter' + +module TestIter +end + +class TestIter::YieldBlock < Test::Unit::TestCase + class YieldTest + include Bug::Iter::Yield + attr_reader :blockarg + def test(arg, &block) + block.call(arg) {|blockarg| @blockarg = blockarg} + end + end + + def test_yield_block + a = YieldTest.new + a.yield_block(:test, "foo") {|x, &b| assert_kind_of(Proc, b); b.call(x)} + assert_equal("foo", a.blockarg) + end +end Property changes on: test/-ext-/iter/test_yield_block.rb ___________________________________________________________________ Added: svn:eol-style + LF Index: test/-ext-/iter/test_iter_break.rb =================================================================== --- test/-ext-/iter/test_iter_break.rb (revision 43926) +++ test/-ext-/iter/test_iter_break.rb (revision 43927) @@ -1,12 +1,15 @@ https://github.com/ruby/ruby/blob/trunk/test/-ext-/iter/test_iter_break.rb#L1 require 'test/unit' -require '-test-/iter/break' +require '-test-/iter' -class TestIterBreak < Test::Unit::TestCase +module TestIter +end + +class TestIter::IterBreak < Test::Unit::TestCase def test_iter_break backport7896 = '[ruby-core:52607]' - assert_equal(nil, 1.times{Bug::Breakable.iter_break}, backport7896) + assert_equal(nil, 1.times{Bug::Iter::Breakable.iter_break}, backport7896) feature5895 = '[ruby-dev:45132]' - assert_equal(42, 1.times{Bug::Breakable.iter_break_value(42)}, feature5895) + assert_equal(42, 1.times{Bug::Iter::Breakable.iter_break_value(42)}, feature5895) end end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/