From 9af743fe0e8c7aa7a25a6805a64d499aab3032af Mon Sep 17 00:00:00 2001 From: ko1 Date: Mon, 12 Aug 2013 06:19:15 +0000 Subject: [PATCH] * 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 --- ChangeLog | 9 +++++++++ class.c | 1 + test/ruby/test_module.rb | 16 ++++++++++++++++ 3 files changed, 26 insertions(+) diff --git a/ChangeLog b/ChangeLog index a3bdf46883..1526d1150c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Mon Aug 12 15:16:58 2013 Koichi Sasada + + * 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 * process.c: [DOC] RDoc formatting of Process.clock_gettime diff --git a/class.c b/class.c index 04e9dcbc2c..f87d2bdcca 100644 --- a/class.c +++ b/class.c @@ -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