* 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
This commit is contained in:
ktsj 2012-08-12 03:04:42 +00:00
Родитель 00468f2109
Коммит 9564e9bd23
5 изменённых файлов: 41 добавлений и 1 удалений

Просмотреть файл

@ -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

14
ext/-test-/bug-5832/bug.c Normal file
Просмотреть файл

@ -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);
}

Просмотреть файл

@ -0,0 +1 @@
create_makefile("-test-/bug-5832/bug")

Просмотреть файл

@ -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

1
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;