diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-08-12 06:19:15 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-08-12 06:19:15 +0000 |
commit | 9af743fe0e8c7aa7a25a6805a64d499aab3032af (patch) | |
tree | 0269c09d852781b6f518a912ca9d82c4e9605411 | |
parent | 7f0a26e2718246c0c171df648e020fc1df873d0b (diff) | |
download | ruby-9af743fe0e8c7aa7a25a6805a64d499aab3032af.tar.gz |
* 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.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42534 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-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 |