diff options
author | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-08-31 05:55:57 +0000 |
---|---|---|
committer | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-08-31 05:55:57 +0000 |
commit | e056ac59a776f87b7043d6c3d14e321ad5cd32d5 (patch) | |
tree | f91d86965dc5f70f2d087164cdc8d696ddbc733c /object.c | |
parent | 7fed54570fe5e31c3b42c947c8bce4c9dd1dea38 (diff) | |
download | bundler-e056ac59a776f87b7043d6c3d14e321ad5cd32d5.tar.gz |
* 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.c | 37 |
1 files changed, 3 insertions, 34 deletions
@@ -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); |