ruby-changes:24534
From: nobu <ko1@a...>
Date: Wed, 1 Aug 2012 00:33:35 +0900 (JST)
Subject: [ruby-changes:24534] nobu:r36585 (trunk): class.c: fix duplication of prepended module
nobu 2012-08-01 00:33:23 +0900 (Wed, 01 Aug 2012) New Revision: 36585 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=36585 Log: class.c: fix duplication of prepended module * class.c (include_class_new): fix duplication of prepended module. since m_tbl of prepended module is always zero, copy from its copy iclass of original. Modified files: trunk/ChangeLog trunk/class.c trunk/test/ruby/test_module.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 36584) +++ ChangeLog (revision 36585) @@ -1,3 +1,9 @@ +Wed Aug 1 00:33:19 2012 Nobuyoshi Nakada <nobu@r...> + + * class.c (include_class_new): fix duplication of prepended module. + since m_tbl of prepended module is always zero, copy from its + copy iclass of original. + Tue Jul 31 18:22:34 2012 Nobuyoshi Nakada <nobu@r...> * variable.c (classname): tell if found name is permanent. search Index: class.c =================================================================== --- class.c (revision 36584) +++ class.c (revision 36585) @@ -636,7 +636,7 @@ } RCLASS_IV_TBL(klass) = RCLASS_IV_TBL(module); RCLASS_CONST_TBL(klass) = RCLASS_CONST_TBL(module); - RCLASS_M_TBL(klass) = RCLASS_M_TBL(module); + RCLASS_M_TBL(klass) = RCLASS_M_TBL(RCLASS_ORIGIN(module)); RCLASS_SUPER(klass) = super; if (RB_TYPE_P(module, T_ICLASS)) { RBASIC(klass)->klass = RBASIC(module)->klass; Index: test/ruby/test_module.rb =================================================================== --- test/ruby/test_module.rb (revision 36584) +++ test/ruby/test_module.rb (revision 36585) @@ -1356,6 +1356,15 @@ assert_equal([:m0, :m1, :m2, :c1], c1.new.x) assert_equal([c2, m0, m1, m2, c0], c2.ancestors[0, 5], bug6662) assert_equal([:c2, :m0, :m1, :m2, :c0], c2.new.x) + + m3 = labeled_module("m3") {include m1; prepend m1} + assert_equal([m3, m0, m1], m3.ancestors) + m3 = labeled_module("m3") {prepend m1; include m1} + assert_equal([m0, m1, m3], m3.ancestors) + m3 = labeled_module("m3") {prepend m1; prepend m1} + assert_equal([m0, m1, m3], m3.ancestors) + m3 = labeled_module("m3") {include m1; include m1} + assert_equal([m3, m0, m1], m3.ancestors) end def labeled_module(name, &block) -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/