diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2012-07-29 01:56:50 -0700 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2012-07-29 01:56:50 -0700 |
| commit | fccd2d4cf0b5566b821824f7682e89e0b7a9f9ef (patch) | |
| tree | dcc83cf727f0537900d700814b38c620f3e2fd39 /src/class.c | |
| parent | 622b3f010b7d32a092e56ed3b99744cc70d7972f (diff) | |
| parent | b71063b239cbbdbdd6779d7b590c0cad59e0c3ae (diff) | |
| download | mruby-fccd2d4cf0b5566b821824f7682e89e0b7a9f9ef.tar.gz mruby-fccd2d4cf0b5566b821824f7682e89e0b7a9f9ef.zip | |
Merge pull request #401 from masamitsu-murase/modify_class_inheritance
Modify class inheritance
Diffstat (limited to 'src/class.c')
| -rw-r--r-- | src/class.c | 37 |
1 files changed, 23 insertions, 14 deletions
diff --git a/src/class.c b/src/class.c index f0393c7ec..6efc9f5e7 100644 --- a/src/class.c +++ b/src/class.c @@ -187,30 +187,39 @@ mrb_define_class(mrb_state *mrb, const char *name, struct RClass *super) struct RClass* mrb_vm_define_class(mrb_state *mrb, mrb_value outer, mrb_value super, mrb_sym id) { - struct RClass *c = 0; + struct RClass *c, *s; if (mrb_const_defined(mrb, outer, id)) { mrb_value v = mrb_const_get(mrb, outer, id); + mrb_check_type(mrb, v, MRB_TT_CLASS); c = mrb_class_ptr(v); - if (!mrb_nil_p(super) && (c->tt != MRB_TT_CLASS || c->super != mrb_class_ptr(super))) { - c = 0; + if (!mrb_nil_p(super)) { + if (mrb_type(super) != MRB_TT_CLASS) { + mrb_raise(mrb, E_TYPE_ERROR, "superclass must be a Class (%s given)", mrb_obj_classname(mrb, super)); + } + + if (!c->super || mrb_class_ptr(super) != mrb_class_real(c->super)) { + mrb_raise(mrb, E_TYPE_ERROR, "superclass mismatch for class %s", mrb_sym2name(mrb, id)); + } } + + return c; } - if (!c) { - struct RClass *s = 0; - if (!mrb_nil_p(super)) { - mrb_check_type(mrb, super, MRB_TT_CLASS); - s = mrb_class_ptr(super); - } - if (!s) { - s = mrb->object_class; + if (!mrb_nil_p(super)) { + if (mrb_type(super) != MRB_TT_CLASS) { + mrb_raise(mrb, E_TYPE_ERROR, "superclass must be a Class (%s given)", mrb_obj_classname(mrb, super)); } - c = mrb_class_new(mrb, s); - setup_class(mrb, outer, c, id); - mrb_funcall(mrb, mrb_obj_value(s), "inherited", 1, mrb_obj_value(c)); + s = mrb_class_ptr(super); } + else { + s = mrb->object_class; + } + + c = mrb_class_new(mrb, s); + setup_class(mrb, outer, c, id); + mrb_funcall(mrb, mrb_obj_value(s), "inherited", 1, mrb_obj_value(c)); return c; } |
