mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* 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
This commit is contained in:
parent
179027d2fb
commit
d48d6f463e
6 changed files with 59 additions and 19 deletions
27
ChangeLog
27
ChangeLog
|
@ -1,3 +1,30 @@
|
|||
Fri Jan 11 05:06:25 2002 Nobuyoshi Nakada <nobu.nakada@nifty.ne.jp>
|
||||
|
||||
* 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().
|
||||
|
||||
Thu Jan 10 19:15:15 2002 Nobuyoshi Nakada <nobu.nakada@nifty.ne.jp>
|
||||
|
||||
* eval.c (rb_add_method): should clear cache by id always.
|
||||
|
|
30
class.c
30
class.c
|
@ -120,6 +120,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;
|
||||
|
@ -130,14 +140,18 @@ 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;
|
||||
|
@ -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);
|
||||
|
|
3
eval.c
3
eval.c
|
@ -3092,8 +3092,9 @@ rb_eval(self, n)
|
|||
override_class:
|
||||
if (!super) super = rb_cObject;
|
||||
klass = rb_define_class_id(node->nd_cname, super);
|
||||
rb_const_set(ruby_class, node->nd_cname, klass);
|
||||
rb_set_class_path(klass,ruby_class,rb_id2name(node->nd_cname));
|
||||
rb_class_inherited(super, klass);
|
||||
rb_const_set(ruby_class, node->nd_cname, klass);
|
||||
}
|
||||
if (ruby_wrapper) {
|
||||
rb_extend_object(klass, ruby_wrapper);
|
||||
|
|
2
intern.h
2
intern.h
|
@ -84,6 +84,8 @@ VALUE rb_mod_dup _((VALUE));
|
|||
VALUE rb_singleton_class_new _((VALUE));
|
||||
VALUE rb_singleton_class_clone _((VALUE));
|
||||
void rb_singleton_class_attached _((VALUE,VALUE));
|
||||
VALUE rb_make_metaclass _((VALUE, VALUE));
|
||||
VALUE rb_class_inherited _((VALUE, VALUE));
|
||||
VALUE rb_define_class_id _((ID, VALUE));
|
||||
VALUE rb_module_new _((void));
|
||||
VALUE rb_define_module_id _((ID));
|
||||
|
|
15
object.c
15
object.c
|
@ -628,11 +628,9 @@ rb_class_s_new(argc, argv)
|
|||
rb_raise(rb_eTypeError, "can't make subclass of virtual class");
|
||||
}
|
||||
klass = rb_class_new(super);
|
||||
/* make metaclass */
|
||||
RBASIC(klass)->klass = rb_singleton_class_new(RBASIC(super)->klass);
|
||||
rb_singleton_class_attached(RBASIC(klass)->klass, klass);
|
||||
rb_make_metaclass(klass, RBASIC(super)->klass);
|
||||
rb_obj_call_init(klass, argc, argv);
|
||||
rb_funcall(super, rb_intern("inherited"), 1, klass);
|
||||
rb_class_inherited(super, klass);
|
||||
|
||||
return klass;
|
||||
}
|
||||
|
@ -1096,12 +1094,9 @@ Init_Object()
|
|||
rb_cModule = boot_defclass("Module", rb_cObject);
|
||||
rb_cClass = boot_defclass("Class", rb_cModule);
|
||||
|
||||
metaclass = RBASIC(rb_cObject)->klass = rb_singleton_class_new(rb_cClass);
|
||||
rb_singleton_class_attached(metaclass, rb_cObject);
|
||||
metaclass = RBASIC(rb_cModule)->klass = rb_singleton_class_new(metaclass);
|
||||
rb_singleton_class_attached(metaclass, rb_cModule);
|
||||
metaclass = RBASIC(rb_cClass)->klass = rb_singleton_class_new(metaclass);
|
||||
rb_singleton_class_attached(metaclass, rb_cClass);
|
||||
metaclass = rb_make_metaclass(rb_cObject, rb_cClass);
|
||||
metaclass = rb_make_metaclass(rb_cModule, metaclass);
|
||||
metaclass = rb_make_metaclass(rb_cClass, metaclass);
|
||||
|
||||
rb_mKernel = rb_define_module("Kernel");
|
||||
rb_include_module(rb_cObject, rb_mKernel);
|
||||
|
|
1
struct.c
1
struct.c
|
@ -165,6 +165,7 @@ make_struct(name, member, klass)
|
|||
|
||||
if (NIL_P(name)) {
|
||||
nstr = rb_class_new(klass);
|
||||
rb_class_inherited(klass, nstr);
|
||||
}
|
||||
else {
|
||||
char *cname = STR2CSTR(name);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue