diff options
author | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-09-25 11:31:02 +0000 |
---|---|---|
committer | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-09-25 11:31:02 +0000 |
commit | 7a86a81dccd6aa6c5268196727c86944443cb9de (patch) | |
tree | a58959f67819ae7615d8df62be29a8bca04ce923 /class.c | |
parent | 6cd13d6577401706d3f008e2f80ec14339988018 (diff) | |
download | ruby-7a86a81dccd6aa6c5268196727c86944443cb9de.tar.gz |
* class.c (rb_make_metaclass): [BUG] Fixed a bus error
on the case for metaclass of a class which includes a
module.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19550 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'class.c')
-rw-r--r-- | class.c | 9 |
1 files changed, 7 insertions, 2 deletions
@@ -190,7 +190,7 @@ VALUE rb_make_metaclass(VALUE obj, VALUE super) { if (BUILTIN_TYPE(obj) == T_CLASS && FL_TEST(obj, FL_SINGLETON)) { - VALUE metaclass; + VALUE metaclass, meta_of_super; if (RBASIC(obj)->klass == obj) { /* for meta^(n)-class of Class */ metaclass = rb_class_boot(obj); RBASIC(metaclass)->klass = metaclass; @@ -202,7 +202,12 @@ rb_make_metaclass(VALUE obj, VALUE super) 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); + + meta_of_super = RCLASS(obj)->ptr->super; + while (FL_TEST(meta_of_super, T_ICLASS)) { + meta_of_super = RCLASS(meta_of_super)->ptr->super; + } + RCLASS(metaclass)->ptr->super = rb_singleton_class(meta_of_super); return metaclass; } else { |