diff options
author | wanabe <wanabe@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-12-30 14:17:32 +0000 |
---|---|---|
committer | wanabe <wanabe@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-12-30 14:17:32 +0000 |
commit | af8df10d3b8b58d934b3603211d2ec9043098b3b (patch) | |
tree | b9229885a1cb5132c309def76f2aed5c916a9428 | |
parent | 962b75384e4b6b388806fa3ff8d4381a2329ccb4 (diff) | |
download | ruby-af8df10d3b8b58d934b3603211d2ec9043098b3b.tar.gz |
* 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
-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)) { |