summaryrefslogtreecommitdiff
path: root/class.c
diff options
context:
space:
mode:
authoryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-09-25 09:46:59 +0000
committeryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-09-25 09:46:59 +0000
commit788001a9c8473130bd357846785838045387b060 (patch)
treef4d4df6103a117fc504bb51d846117b5d376a92c /class.c
parentfaefcc8249e83d6b122213dfae15cb66c798ab6a (diff)
* 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.) git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19546 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'class.c')
-rw-r--r--class.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/class.c b/class.c
index 8a8e9c1f40..7cfe05b236 100644
--- a/class.c
+++ b/class.c
@@ -190,7 +190,20 @@ VALUE
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;