From 9564e9bd235c2c0b2bccda1849bba9c40b508c3e Mon Sep 17 00:00:00 2001 From: ktsj Date: Sun, 12 Aug 2012 03:04:42 +0000 Subject: * vm.c (invoke_block_from_c): fix unintentional block passing. [ruby-dev:45071] [Bug #5832] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36685 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ ext/-test-/bug-5832/bug.c | 14 ++++++++++++++ ext/-test-/bug-5832/extconf.rb | 1 + test/-ext-/test_bug-5832.rb | 21 +++++++++++++++++++++ vm.c | 1 - 5 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 ext/-test-/bug-5832/bug.c create mode 100644 ext/-test-/bug-5832/extconf.rb create mode 100644 test/-ext-/test_bug-5832.rb 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 + + * vm.c (invoke_block_from_c): fix unintentional block passing. + [ruby-dev:45071] [Bug #5832] + Fri Aug 10 08:41:28 2012 Eric Hodel * 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 + +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; -- cgit v1.2.3