summaryrefslogtreecommitdiffstats
path: root/class.c
diff options
context:
space:
mode:
authoryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-09-25 11:31:02 +0000
committeryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-09-25 11:31:02 +0000
commitf92d8eb89ecec617668f9ef994ee0aefcda12e1a (patch)
treea58959f67819ae7615d8df62be29a8bca04ce923 /class.c
parent0f1c4c53b5a1d45155136193ac233147a6620d79 (diff)
downloadruby-f92d8eb89ecec617668f9ef994ee0aefcda12e1a.tar.gz
ruby-f92d8eb89ecec617668f9ef994ee0aefcda12e1a.tar.xz
ruby-f92d8eb89ecec617668f9ef994ee0aefcda12e1a.zip
* 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: http://svn.ruby-lang.org/repos/ruby/trunk@19550 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'class.c')
-rw-r--r--class.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/class.c b/class.c
index 7cfe05b23..9ec27611e 100644
--- a/class.c
+++ b/class.c
@@ -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 {