diff options
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | class.c | 1 | ||||
-rw-r--r-- | test/ruby/test_module.rb | 16 |
3 files changed, 26 insertions, 0 deletions
@@ -1,3 +1,12 @@ +Mon Aug 12 15:16:58 2013 Koichi Sasada <ko1@atdot.net> + + * class.c (rb_prepend_module): make T_ICLASS object shady because + this T_ICLASS object seems to share method table with other class + objects. It was causes WB miss. + TODO: need to know the data structure. + + * test/ruby/test_module.rb: add a test for WB miss. + Mon Aug 12 13:47:54 2013 Zachary Scott <e@zzak.io> * process.c: [DOC] RDoc formatting of Process.clock_gettime @@ -826,6 +826,7 @@ rb_prepend_module(VALUE klass, VALUE module) origin = RCLASS_ORIGIN(klass); if (origin == klass) { origin = class_alloc(T_ICLASS, klass); + OBJ_WB_UNPROTECT(origin); /* TODO: conservertive shading. Need more survery. */ RCLASS_SET_SUPER(origin, RCLASS_SUPER(klass)); RCLASS_SET_SUPER(klass, origin); RCLASS_ORIGIN(klass) = origin; diff --git a/test/ruby/test_module.rb b/test/ruby/test_module.rb index 361a6fe993..b0a33c8609 100644 --- a/test/ruby/test_module.rb +++ b/test/ruby/test_module.rb @@ -1760,4 +1760,20 @@ class TestModule < Test::Unit::TestCase self.#{method} INPUT end + + def test_prepend_gc + assert_separately [], %{ + module Foo + end + class Object + prepend Foo + end + GC.start # make created T_ICLASS old (or remembered shady) + class Object # add methods into T_ICLASS (need WB if it is old) + def foo; end + attr_reader :bar + end + 1_000_000.times{''} # cause GC + } + end end |