ruby-changes:24634
From: ktsj <ko1@a...>
Date: Sun, 12 Aug 2012 12:04:55 +0900 (JST)
Subject: [ruby-changes:24634] ktsj:r36685 (trunk): * vm.c (invoke_block_from_c): fix unintentional block passing.
ktsj 2012-08-12 12:04:42 +0900 (Sun, 12 Aug 2012) New Revision: 36685 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=36685 Log: * vm.c (invoke_block_from_c): fix unintentional block passing. [ruby-dev:45071] [Bug #5832] Added directories: trunk/ext/-test-/bug-5832/ Added files: trunk/ext/-test-/bug-5832/bug.c trunk/ext/-test-/bug-5832/extconf.rb trunk/test/-ext-/test_bug-5832.rb Modified files: trunk/ChangeLog trunk/vm.c Index: ChangeLog =================================================================== --- ChangeLog (revision 36684) +++ ChangeLog (revision 36685) @@ -1,3 +1,8 @@ +Sun Aug 12 11:57:20 2012 Kazuki Tsujimoto <kazuki@c...> + + * 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@s...> * gc.c (gc_malloc_allocated_size): RDoc does not process macros, so Index: ext/-test-/bug-5832/extconf.rb =================================================================== --- ext/-test-/bug-5832/extconf.rb (revision 0) +++ ext/-test-/bug-5832/extconf.rb (revision 36685) @@ -0,0 +1 @@ +create_makefile("-test-/bug-5832/bug") Index: ext/-test-/bug-5832/bug.c =================================================================== --- ext/-test-/bug-5832/bug.c (revision 0) +++ ext/-test-/bug-5832/bug.c (revision 36685) @@ -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); +} Index: vm.c =================================================================== --- vm.c (revision 36684) +++ vm.c (revision 36685) @@ -604,7 +604,6 @@ 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; Index: test/-ext-/test_bug-5832.rb =================================================================== --- test/-ext-/test_bug-5832.rb (revision 0) +++ test/-ext-/test_bug-5832.rb (revision 36685) @@ -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 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/