diff --git a/ChangeLog b/ChangeLog index 80aa9ec51f..1507167158 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Fri Jan 11 20:20:16 2008 Nobuyoshi Nakada + + * proc.c (proc_mark): needs to mark the receiver too. a patch from + Chris Heath in [ruby-core:14983]. + [ruby-core:14885] + Fri Jan 11 18:28:49 2008 Eric Hodel * lib/rdoc/usage.rb: Removed. diff --git a/bootstraptest/test_proc.rb b/bootstraptest/test_proc.rb index 049bc99131..875a000b7c 100644 --- a/bootstraptest/test_proc.rb +++ b/bootstraptest/test_proc.rb @@ -253,3 +253,10 @@ assert_equal %q{3}, %q{ a + 2 }.call } + +assert_equal %q{ok}, %q{ + class A; def get_block; proc {puts "ok"} end end + block = A.new.get_block + GC.start + block.call +} diff --git a/proc.c b/proc.c index ac7f39bdb4..c8eac602a7 100644 --- a/proc.c +++ b/proc.c @@ -52,6 +52,7 @@ proc_mark(void *ptr) RUBY_MARK_UNLESS_NULL(proc->blockprocval); RUBY_MARK_UNLESS_NULL((VALUE)proc->special_cref_stack); RUBY_MARK_UNLESS_NULL(proc->block.proc); + RUBY_MARK_UNLESS_NULL(proc->block.self); if (proc->block.iseq && RUBY_VM_IFUNC_P(proc->block.iseq)) { RUBY_MARK_UNLESS_NULL((VALUE)(proc->block.iseq)); }