diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | ext/-test-/funcall/extconf.rb | 2 | ||||
-rw-r--r-- | ext/-test-/funcall/passing_block.c | 30 | ||||
-rw-r--r-- | include/ruby/ruby.h | 1 | ||||
-rw-r--r-- | test/-ext-/funcall/test_passing_block.rb | 22 |
5 files changed, 60 insertions, 0 deletions
@@ -1,3 +1,8 @@ +Fri Mar 18 00:54:20 2011 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * include/ruby/ruby.h (rb_funcall_passing_block): add prototype. + a patch by James M. Lawrence at [ruby-core:35501] + Wed Mar 16 08:40:39 2011 Tanaka Akira <akr@fsij.org> * ext/openssl/ossl_x509name.c: parenthesize macro arguments. diff --git a/ext/-test-/funcall/extconf.rb b/ext/-test-/funcall/extconf.rb new file mode 100644 index 0000000000..8a9179ab2f --- /dev/null +++ b/ext/-test-/funcall/extconf.rb @@ -0,0 +1,2 @@ +require 'mkmf' +create_makefile("-test-/funcall/funcall") diff --git a/ext/-test-/funcall/passing_block.c b/ext/-test-/funcall/passing_block.c new file mode 100644 index 0000000000..0200f80369 --- /dev/null +++ b/ext/-test-/funcall/passing_block.c @@ -0,0 +1,30 @@ +#include "ruby.h" + +VALUE rb_funcall_passing_block(VALUE, ID, int, const VALUE*); + +static VALUE +with_funcall2(int argc, VALUE *argv, VALUE self) +{ + return rb_funcall2(self, rb_intern("target"), argc, argv); +} + +static VALUE +with_funcall_passing_block(int argc, VALUE *argv, VALUE self) +{ + return rb_funcall_passing_block(self, rb_intern("target"), argc, argv); +} + +void +Init_funcall(void) +{ + VALUE cRelay = rb_path2class("TestFuncall::Relay"); + + rb_define_singleton_method(cRelay, + "with_funcall2", + with_funcall2, + -1); + rb_define_singleton_method(cRelay, + "with_funcall_passing_block", + with_funcall_passing_block, + -1); +} diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h index afa181509a..a3f7bd6c68 100644 --- a/include/ruby/ruby.h +++ b/include/ruby/ruby.h @@ -1144,6 +1144,7 @@ VALUE rb_eval_string_wrap(const char*, int*); VALUE rb_funcall(VALUE, ID, int, ...); VALUE rb_funcall2(VALUE, ID, int, const VALUE*); VALUE rb_funcall3(VALUE, ID, int, const VALUE*); +VALUE rb_funcall_passing_block(VALUE, ID, int, const VALUE*); int rb_scan_args(int, const VALUE*, const char*, ...); VALUE rb_call_super(int, const VALUE*); diff --git a/test/-ext-/funcall/test_passing_block.rb b/test/-ext-/funcall/test_passing_block.rb new file mode 100644 index 0000000000..87aed2212c --- /dev/null +++ b/test/-ext-/funcall/test_passing_block.rb @@ -0,0 +1,22 @@ +require 'test/unit' + +class TestFuncall < Test::Unit::TestCase + module Relay + def self.target(*args, &block) + yield(*args) if block + end + end + require '-test-/funcall/funcall' + + def test_with_funcall2 + ok = nil + Relay.with_funcall2("feature#4504") {|arg| ok = arg || true} + assert_nil(ok) + end + + def test_with_funcall_passing_block + ok = nil + Relay.with_funcall_passing_block("feature#4504") {|arg| ok = arg || true} + assert_equal("feature#4504", ok) + end +end |