aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--ext/-test-/funcall/extconf.rb2
-rw-r--r--ext/-test-/funcall/passing_block.c30
-rw-r--r--include/ruby/ruby.h1
-rw-r--r--test/-ext-/funcall/test_passing_block.rb22
5 files changed, 60 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 7cac3060a3..08adb80c2d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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