summaryrefslogtreecommitdiff
path: root/class.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-01-10 23:38:57 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-01-10 23:38:57 +0000
commitd48d6f463ed7a5afb6f1bf87840eb43dbb92b761 (patch)
treee85f6a00d46e84a2e44f937fd2eea893b60d8b7e /class.c
parent179027d2fbb6d8ddb49e42c3f93b7d664ce5faa7 (diff)
* class.c (rb_make_metaclass): [new]
* class.c (rb_define_class_id): use rb_make_metaclass(), don't call Class#inherited hook. * class.c (rb_class_inherited): [new] * class.c (rb_define_class): call Class#inherited hook here. * class.c (rb_define_class_under): ditto after class path is set. * class.c (rb_singleton_class): use rb_make_metaclass(). * eval.c (rb_eval): same as rb_define_class_under(). * intern.h: prototypes of rb_make_metaclass() and rb_class_inherited(). * object.c (rb_class_s_new): use rb_make_metaclass() and rb_class_inherited(). * object.c (Init_Object): use rb_make_metaclass(). * struct.c (make_struct): use rb_class_inherited(). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_6@1984 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'class.c')
-rw-r--r--class.c30
1 files changed, 22 insertions, 8 deletions
diff --git a/class.c b/class.c
index 965359e8de..9e96d692c8 100644
--- a/class.c
+++ b/class.c
@@ -121,6 +121,16 @@ rb_singleton_class_attached(klass, obj)
}
VALUE
+rb_make_metaclass(obj, klass)
+ VALUE obj, klass;
+{
+ klass = rb_singleton_class_new(klass);
+ RBASIC(obj)->klass = klass;
+ rb_singleton_class_attached(klass, obj);
+ return klass;
+}
+
+VALUE
rb_define_class_id(id, super)
ID id;
VALUE super;
@@ -130,15 +140,19 @@ rb_define_class_id(id, super)
if (!super) super = rb_cObject;
klass = rb_class_new(super);
rb_name_class(klass, id);
- /* make metaclass */
- RBASIC(klass)->klass = rb_singleton_class_new(RBASIC(super)->klass);
- rb_singleton_class_attached(RBASIC(klass)->klass, klass);
- rb_funcall(super, rb_intern("inherited"), 1, klass);
+ rb_make_metaclass(klass, RBASIC(super)->klass);
return klass;
}
VALUE
+rb_class_inherited(super, klass)
+ VALUE super, klass;
+{
+ return rb_funcall(super, rb_intern("inherited"), 1, klass);
+}
+
+VALUE
rb_define_class(name, super)
const char *name;
VALUE super;
@@ -158,6 +172,7 @@ rb_define_class(name, super)
return klass;
}
klass = rb_define_class_id(id, super);
+ rb_class_inherited(super, klass);
st_add_direct(rb_class_tbl, id, klass);
@@ -185,8 +200,9 @@ rb_define_class_under(outer, name, super)
return klass;
}
klass = rb_define_class_id(id, super);
- rb_const_set(outer, id, klass);
rb_set_class_path(klass, outer, name);
+ rb_class_inherited(super, klass);
+ rb_const_set(outer, id, klass);
return klass;
}
@@ -602,9 +618,7 @@ rb_singleton_class(obj)
klass = RBASIC(obj)->klass;
}
else {
- klass = rb_singleton_class_new(RBASIC(obj)->klass);
- RBASIC(obj)->klass = klass;
- rb_singleton_class_attached(klass, obj);
+ klass = rb_make_metaclass(obj, RBASIC(obj)->klass);
}
if (OBJ_TAINTED(obj)) {
OBJ_TAINT(klass);