summaryrefslogtreecommitdiffhomepage
path: root/src/class.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2013-08-15 00:35:41 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2013-08-15 00:35:41 +0900
commitbabc8d00865b86c77032cfe4d69ddfea3ac9f4ef (patch)
tree80485f62ef1aeb31effe161b175082e27cf03d32 /src/class.c
parent6e978d55749f32b49d57cd08723c0d734c898fb9 (diff)
downloadmruby-babc8d00865b86c77032cfe4d69ddfea3ac9f4ef.tar.gz
mruby-babc8d00865b86c77032cfe4d69ddfea3ac9f4ef.zip
implement Class.new in C again
Diffstat (limited to 'src/class.c')
-rw-r--r--src/class.c17
1 files changed, 16 insertions, 1 deletions
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));