summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--gc.c4
-rw-r--r--test/ruby/test_method.rb12
-rw-r--r--version.h2
4 files changed, 21 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index ed13397a30..d5dd635384 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/gc.c b/gc.c
index f0d342aef7..01d908d1b7 100644
--- a/gc.c
+++ b/gc.c
@@ -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
diff --git a/version.h b/version.h
index 6f20e3446f..db19429db1 100644
--- a/version.h
+++ b/version.h
@@ -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