diff options
author | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-09-25 09:46:59 +0000 |
---|---|---|
committer | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-09-25 09:46:59 +0000 |
commit | 4520ae9543a0d2791dd14772ebd57cff729e3b79 (patch) | |
tree | f4d4df6103a117fc504bb51d846117b5d376a92c /class.c | |
parent | 15bd942de4953fef0af134ec1662dec02c21b7c6 (diff) | |
download | ruby-4520ae9543a0d2791dd14772ebd57cff729e3b79.tar.gz ruby-4520ae9543a0d2791dd14772ebd57cff729e3b79.tar.xz ruby-4520ae9543a0d2791dd14772ebd57cff729e3b79.zip |
* 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: http://svn.ruby-lang.org/repos/ruby/trunk@19546 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'class.c')
-rw-r--r-- | class.c | 15 |
1 files changed, 14 insertions, 1 deletions
@@ -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; |