[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]