diff options
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | ext/-test-/iter/break.c | 4 | ||||
-rw-r--r-- | ext/-test-/iter/extconf.rb | 8 | ||||
-rw-r--r-- | ext/-test-/iter/init.c | 11 | ||||
-rw-r--r-- | ext/-test-/iter/yield.c | 16 | ||||
-rw-r--r-- | test/-ext-/iter/test_iter_break.rb | 11 | ||||
-rw-r--r-- | test/-ext-/iter/test_yield_block.rb | 21 | ||||
-rw-r--r-- | vm_eval.c | 4 |
8 files changed, 71 insertions, 8 deletions
@@ -1,3 +1,7 @@ +Sat Nov 30 13:21:15 2013 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * vm_eval.c (rb_yield_block): implement non-nil block argument. + Fri Nov 29 20:59:39 2013 Masaya Tarui <tarui@ruby-lang.org> * vm_dump.c (rb_vmdebug_debug_print_pre): Bugfix. Get PC directly. diff --git a/ext/-test-/iter/break.c b/ext/-test-/iter/break.c index 56ba7e7ffd..66ed26a9b8 100644 --- a/ext/-test-/iter/break.c +++ b/ext/-test-/iter/break.c @@ -17,9 +17,9 @@ iter_break_value(VALUE self, VALUE val) } 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); } diff --git a/ext/-test-/iter/extconf.rb b/ext/-test-/iter/extconf.rb index 695b5e9f6d..0ba99691bd 100644 --- a/ext/-test-/iter/extconf.rb +++ b/ext/-test-/iter/extconf.rb @@ -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") diff --git a/ext/-test-/iter/init.c b/ext/-test-/iter/init.c new file mode 100644 index 0000000000..a074ec46a9 --- /dev/null +++ b/ext/-test-/iter/init.c @@ -0,0 +1,11 @@ +#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); +} diff --git a/ext/-test-/iter/yield.c b/ext/-test-/iter/yield.c new file mode 100644 index 0000000000..3cd408a928 --- /dev/null +++ b/ext/-test-/iter/yield.c @@ -0,0 +1,16 @@ +#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); +} diff --git a/test/-ext-/iter/test_iter_break.rb b/test/-ext-/iter/test_iter_break.rb index 1ef2aad3c2..5bac6331fd 100644 --- a/test/-ext-/iter/test_iter_break.rb +++ b/test/-ext-/iter/test_iter_break.rb @@ -1,12 +1,15 @@ 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 diff --git a/test/-ext-/iter/test_yield_block.rb b/test/-ext-/iter/test_yield_block.rb new file mode 100644 index 0000000000..bec993c950 --- /dev/null +++ b/test/-ext-/iter/test_yield_block.rb @@ -0,0 +1,21 @@ +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 @@ -994,7 +994,9 @@ rb_yield_block(VALUE val, VALUE arg, int argc, const VALUE *argv, VALUE blockarg { 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); } |