summaryrefslogtreecommitdiff
path: root/object.c
diff options
context:
space:
mode:
authoryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-08-31 05:55:57 +0000
committeryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-08-31 05:55:57 +0000
commite056ac59a776f87b7043d6c3d14e321ad5cd32d5 (patch)
treef91d86965dc5f70f2d087164cdc8d696ddbc733c /object.c
parent7fed54570fe5e31c3b42c947c8bce4c9dd1dea38 (diff)
* class.c: refactored singleton class related matters.
Handles eigenclasses and plain classes transparently. (make_metaclass): renamed from make_metametaclass. (METACLASS_OF): new utility macro (META_CLASS_OF_CLASS_CLASS): ditto. (ENSURE_EIGENCLASS): ditto. (make_singleton_class): extracted from rb_singleton_class. (boot_defclass): moved from object.c (Init_class_hierarchy): extracted from Init_Object. (rb_make_metaclass): refactored. (singleton_class_of): extracted from rb_singleton_class. (rb_singleton_class): refactored. (rb_define_singleton_method): it needs a metaclass only but not its metametaclass. * object.c: booting class hierarchy was moved to class.c for keeping dependency between compilation units least. (Init_Object): extracting the booting into Init_class_hierarchy. (boot_defclass): moved to class.c. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@24720 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'object.c')
-rw-r--r--object.c37
1 files changed, 3 insertions, 34 deletions
diff --git a/object.c b/object.c
index c2b10832de..78dbcdc889 100644
--- a/object.c
+++ b/object.c
@@ -2386,25 +2386,6 @@ rb_f_array(VALUE obj, VALUE arg)
return rb_Array(arg);
}
-static VALUE
-boot_defclass(const char *name, VALUE super)
-{
- extern st_table *rb_class_tbl;
- VALUE obj = rb_class_boot(super);
- ID id = rb_intern(name);
-
- rb_name_class(obj, id);
- st_add_direct(rb_class_tbl, id, obj);
- rb_const_set((rb_cObject ? rb_cObject : obj), id, obj);
- return obj;
-}
-
-static void
-boot_defmetametaclass(VALUE klass, VALUE metametaclass)
-{
- RBASIC(RBASIC(klass)->klass)->klass = metametaclass;
-}
-
/*
* Document-class: Class
*
@@ -2504,26 +2485,14 @@ boot_defmetametaclass(VALUE klass, VALUE metametaclass)
void
Init_Object(void)
{
+ extern void Init_class_hierarchy(void);
int i;
+ Init_class_hierarchy();
+
#undef rb_intern
#define rb_intern(str) rb_intern_const(str)
- VALUE metaclass;
-
- rb_cBasicObject = boot_defclass("BasicObject", 0);
- rb_cObject = boot_defclass("Object", rb_cBasicObject);
- rb_cModule = boot_defclass("Module", rb_cObject);
- rb_cClass = boot_defclass("Class", rb_cModule);
-
- metaclass = rb_make_metaclass(rb_cBasicObject, rb_cClass);
- metaclass = rb_make_metaclass(rb_cObject, metaclass);
- metaclass = rb_make_metaclass(rb_cModule, metaclass);
- metaclass = rb_make_metaclass(rb_cClass, metaclass);
- boot_defmetametaclass(rb_cModule, metaclass);
- boot_defmetametaclass(rb_cObject, metaclass);
- boot_defmetametaclass(rb_cBasicObject, metaclass);
-
rb_define_private_method(rb_cBasicObject, "initialize", rb_obj_dummy, 0);
rb_define_alloc_func(rb_cBasicObject, rb_class_allocate_instance);
rb_define_method(rb_cBasicObject, "==", rb_obj_equal, 1);