1
0
Fork 0
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/trunk@1983 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2002-01-10 20:18:39 +00:00
parent 399bb7e739
commit 5915dc245e
6 changed files with 59 additions and 19 deletions

30
class.c
View file

@ -141,6 +141,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;
@ -151,14 +161,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;
@ -179,6 +193,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);
return klass;
@ -205,8 +220,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;
}
@ -653,9 +669,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);