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

ruby-changes:8021

From: yugui <ko1@a...>
Date: Thu, 25 Sep 2008 18:47:18 +0900 (JST)
Subject: [ruby-changes:8021] Ruby:r19546 (trunk): * class.c (rb_make_metaclass): Made class of class of class

yugui	2008-09-25 18:46:59 +0900 (Thu, 25 Sep 2008)

  New Revision: 19546

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=19546

  Log:
    * class.c (rb_make_metaclass): Made class of class of class
      from Class into its own eigenclass. Now meta^(n)-class
      hierarchy regresses infinitely, again.
      (This feature was decided on developer-meeting-20080922.)

  Modified files:
    trunk/ChangeLog
    trunk/class.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 19545)
+++ ChangeLog	(revision 19546)
@@ -1,10 +1,17 @@
-2008-09-25  Jim Weirich  <jim@t...>
+Thu Sep 25 18:40:42 2008  Yuki Sonoda (Yugui)  <yugui@y...>
 
+	* class.c (rb_make_metaclass): Made class of class of class
+	  from Class into its own eigenclass. Now meta^(n)-class
+	  hierarchy regresses infinitely, again.
+	  (This feature was decided on developer-meeting-20080922.)
+
+Thu Sep 25 16:01:07 2008  Jim Weirich  <jim@t...>
+
 	* lib/rake.rb: Update rake source to version 0.8.3.  This
-	version includes some fixes for running Rake on windows. (1)
-	better APPDATA/HOMExxx/USERPROFILE integration for system
-	rakefiles, (2) Better handling of the :ruby command when
-	installed in directory containing spaces.
+	  version includes some fixes for running Rake on windows. 
+	  (1) better APPDATA/HOMExxx/USERPROFILE integration for 
+	  system rakefiles, (2) Better handling of the :ruby command 
+	  when installed in directory containing spaces.
 
 Thu Sep 25 11:22:51 2008
 
Index: class.c
===================================================================
--- class.c	(revision 19545)
+++ class.c	(revision 19546)
@@ -190,7 +190,20 @@
 rb_make_metaclass(VALUE obj, VALUE super)
 {
     if (BUILTIN_TYPE(obj) == T_CLASS && FL_TEST(obj, FL_SINGLETON)) {
-	return RBASIC(obj)->klass = rb_cClass;
+        VALUE metaclass;
+        if (RBASIC(obj)->klass == obj) { /* for meta^(n)-class of Class */
+            metaclass = rb_class_boot(obj);
+            RBASIC(metaclass)->klass = metaclass;
+        }
+        else {
+            metaclass = rb_class_boot(super);
+            RBASIC(metaclass)->klass = rb_singleton_class(RBASIC(obj)->klass);
+        }
+        FL_SET(metaclass, FL_SINGLETON);
+        rb_singleton_class_attached(metaclass, obj);
+        RBASIC(obj)->klass = metaclass;
+        RCLASS(metaclass)->ptr->super = rb_singleton_class(RCLASS(obj)->ptr->super);
+        return metaclass;
     }
     else {
 	VALUE metasuper;

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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