From babc8d00865b86c77032cfe4d69ddfea3ac9f4ef Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Thu, 15 Aug 2013 00:35:41 +0900 Subject: implement Class.new in C again --- src/class.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'src/class.c') diff --git a/src/class.c b/src/class.c index dc3c49d5d..b5c561d06 100644 --- a/src/class.c +++ b/src/class.c @@ -1055,6 +1055,20 @@ mrb_obj_new(mrb_state *mrb, struct RClass *c, int argc, mrb_value *argv) return obj; } +static mrb_value +mrb_class_new_class(mrb_state *mrb, mrb_value cv) +{ + mrb_value super; + struct RClass *new_class; + + if (mrb_get_args(mrb, "|o", &super) == 0) { + super = mrb_obj_value(mrb->object_class); + } + new_class = mrb_class_new(mrb, mrb_class_ptr(super)); + mrb_funcall(mrb, super, "inherited", 1, mrb_obj_value(new_class)); + return mrb_obj_value(new_class); +} + mrb_value mrb_class_superclass(mrb_state *mrb, mrb_value klass) { @@ -1871,8 +1885,9 @@ mrb_init_class(mrb_state *mrb) mrb_define_method(mrb, bob, "!", mrb_bob_not, MRB_ARGS_NONE()); mrb_define_method(mrb, bob, "method_missing", mrb_bob_missing, MRB_ARGS_ANY()); /* 15.3.1.3.30 */ - mrb_define_method(mrb, cls, "superclass", mrb_class_superclass, MRB_ARGS_NONE()); /* 15.2.3.3.4 */ + mrb_define_class_method(mrb, cls, "new", mrb_class_new_class, MRB_ARGS_ANY()); mrb_define_method(mrb, cls, "alloc", mrb_instance_alloc, MRB_ARGS_NONE()); + mrb_define_method(mrb, cls, "superclass", mrb_class_superclass, MRB_ARGS_NONE()); /* 15.2.3.3.4 */ mrb_define_method(mrb, cls, "new", mrb_instance_new, MRB_ARGS_ANY()); /* 15.2.3.3.3 */ mrb_define_method(mrb, cls, "inherited", mrb_bob_init, MRB_ARGS_REQ(1)); -- cgit v1.2.3