From 788001a9c8473130bd357846785838045387b060 Mon Sep 17 00:00:00 2001 From: yugui Date: Thu, 25 Sep 2008 09:46:59 +0000 Subject: * 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 --- class.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'class.c') 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; -- cgit v1.2.3