summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--ext/-test-/bug-5832/bug.c14
-rw-r--r--ext/-test-/bug-5832/extconf.rb1
-rw-r--r--test/-ext-/test_bug-5832.rb21
-rw-r--r--vm.c1
5 files changed, 41 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index ed41fc2d4d..2a15949f61 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Sun Aug 12 11:57:20 2012 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * vm.c (invoke_block_from_c): fix unintentional block passing.
+ [ruby-dev:45071] [Bug #5832]
+
Fri Aug 10 08:41:28 2012 Eric Hodel <drbrain@segment7.net>
* gc.c (gc_malloc_allocated_size): RDoc does not process macros, so
diff --git a/ext/-test-/bug-5832/bug.c b/ext/-test-/bug-5832/bug.c
new file mode 100644
index 0000000000..67be5844b6
--- /dev/null
+++ b/ext/-test-/bug-5832/bug.c
@@ -0,0 +1,14 @@
+#include <ruby.h>
+
+static VALUE
+bug_funcall_callback(VALUE self, VALUE obj)
+{
+ return rb_funcall(obj, rb_intern("callback"), 0);
+}
+
+void
+Init_bug(void)
+{
+ VALUE mBug = rb_define_module("Bug");
+ rb_define_module_function(mBug, "funcall_callback", bug_funcall_callback, 1);
+}
diff --git a/ext/-test-/bug-5832/extconf.rb b/ext/-test-/bug-5832/extconf.rb
new file mode 100644
index 0000000000..55a4b7d93f
--- /dev/null
+++ b/ext/-test-/bug-5832/extconf.rb
@@ -0,0 +1 @@
+create_makefile("-test-/bug-5832/bug")
diff --git a/test/-ext-/test_bug-5832.rb b/test/-ext-/test_bug-5832.rb
new file mode 100644
index 0000000000..11f8a52a95
--- /dev/null
+++ b/test/-ext-/test_bug-5832.rb
@@ -0,0 +1,21 @@
+require '-test-/bug-5832/bug'
+
+class Test_BUG_5832 < Test::Unit::TestCase
+ def test_block_passing
+ bug5832 = '[ruby-dev:45071]'
+
+ c = Class.new do
+ define_method(:call_invoke_block_from_c) do
+ Bug.funcall_callback(self)
+ end
+
+ def callback
+ yield if block_given?
+ end
+ end
+
+ assert_nothing_raised(RuntimeError, bug5832) do
+ c.new.call_invoke_block_from_c { raise 'unreachable' }
+ end
+ end
+end
diff --git a/vm.c b/vm.c
index 63021533b6..30d0f8a7bd 100644
--- a/vm.c
+++ b/vm.c
@@ -604,7 +604,6 @@ invoke_block_from_c(rb_thread_t *th, const rb_block_t *block,
cfp->sp + arg_size, iseq->local_size - arg_size,
th->passed_me);
th->passed_me = 0;
- th->passed_block = blockptr;
if (cref) {
th->cfp->ep[-1] = (VALUE)cref;