diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | gc.c | 4 | ||||
-rw-r--r-- | test/ruby/test_method.rb | 12 | ||||
-rw-r--r-- | version.h | 2 |
4 files changed, 21 insertions, 2 deletions
@@ -1,3 +1,8 @@ +Thu Nov 15 15:17:11 2012 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * gc.c (free_method_entry_i): method entry may be in + unlinked_method_entry_list. [ruby-core:43383][Bug #6171] + Wed Nov 14 20:20:46 2012 Naohisa Goto <ngotogenome@gmail.com> * ruby_atomic.h: renamed from atomic.h to avoid header file name @@ -1673,7 +1673,9 @@ mark_m_tbl(rb_objspace_t *objspace, st_table *tbl) static int free_method_entry_i(ID key, rb_method_entry_t *me, st_data_t data) { - rb_free_method_entry(me); + if (!me->mark) { + rb_free_method_entry(me); + } return ST_CONTINUE; } diff --git a/test/ruby/test_method.rb b/test/ruby/test_method.rb index 2cc0de5409..ea6c5f2164 100644 --- a/test/ruby/test_method.rb +++ b/test/ruby/test_method.rb @@ -460,4 +460,16 @@ class TestMethod < Test::Unit::TestCase assert_nothing_raised { v.instance_eval { mv2 } } assert_nothing_raised { v.instance_eval { mv3 } } end + + def test_bound_method_entry + bug6171 = '[ruby-core:43383]' + assert_ruby_status([], <<-EOC, bug6171) + class Bug6171 + def initialize(target) + define_singleton_method(:reverse, target.method(:reverse).to_proc) + end + end + 1000.times {p = Bug6171.new('test'); 10000.times {p.reverse}} + EOC + end end @@ -1,5 +1,5 @@ #define RUBY_VERSION "1.9.3" -#define RUBY_PATCHLEVEL 331 +#define RUBY_PATCHLEVEL 332 #define RUBY_RELEASE_DATE "2012-11-15" #define RUBY_RELEASE_YEAR 2012 |