diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | test/ruby/test_gc.rb | 15 | ||||
-rw-r--r-- | vm.c | 5 |
3 files changed, 23 insertions, 2 deletions
@@ -1,3 +1,8 @@ +Thu Dec 30 23:09:47 2010 wanabe <s.wanabe@gmail.com> + + * vm.c (vm_define_method): guard iseq from GC while method definition. + [ruby-dev:42832] + Thu Dec 30 20:18:32 2010 KOSAKI Motohiro <kosaki.motohiro@gmail.com> * win32/Makefile.sub: ditto. diff --git a/test/ruby/test_gc.rb b/test/ruby/test_gc.rb index 039240f1e0..32b6e9f481 100644 --- a/test/ruby/test_gc.rb +++ b/test/ruby/test_gc.rb @@ -63,4 +63,19 @@ class TestGc < Test::Unit::TestCase assert_equal(false, res.empty?) assert_kind_of(Integer, res[:count]) end + + def test_singleton_method + prev_stress = GC.stress + assert_nothing_raised("[ruby-dev:42832]") do + GC.stress = true + 10.times do + obj = Object.new + def obj.foo() end + def obj.bar() raise "obj.foo is called, but this is obj.bar" end + obj.foo + end + end + ensure + GC.stress = prev_stress + end end @@ -1837,8 +1837,9 @@ vm_define_method(rb_thread_t *th, VALUE obj, ID id, VALUE iseqval, GetISeqPtr(iseqval, miseq); if (miseq->klass) { - iseqval = rb_iseq_clone(iseqval, 0); - GetISeqPtr(iseqval, miseq); + iseqval = rb_iseq_clone(iseqval, 0); + RB_GC_GUARD(iseqval); + GetISeqPtr(iseqval, miseq); } if (NIL_P(klass)) { |