From af8df10d3b8b58d934b3603211d2ec9043098b3b Mon Sep 17 00:00:00 2001 From: wanabe Date: Thu, 30 Dec 2010 14:17:32 +0000 Subject: [PATCH] * vm.c (vm_define_method): guard iseq from GC while method definition. [ruby-dev:42832] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@30432 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ test/ruby/test_gc.rb | 15 +++++++++++++++ vm.c | 5 +++-- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index aead2e1d93..5007635d68 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Thu Dec 30 23:09:47 2010 wanabe + + * vm.c (vm_define_method): guard iseq from GC while method definition. + [ruby-dev:42832] + Thu Dec 30 20:18:32 2010 KOSAKI Motohiro * 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 diff --git a/vm.c b/vm.c index 015456bd93..b4d8ff7e80 100644 --- a/vm.c +++ b/vm.c @@ -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)) {