diff options
| author | Masamitsu MURASE <[email protected]> | 2012-07-14 23:07:00 +0900 |
|---|---|---|
| committer | Masamitsu MURASE <[email protected]> | 2012-07-29 14:21:12 +0900 |
| commit | 99e2035f42c0f29b316b335a91085ae6fbde5893 (patch) | |
| tree | dde48ac9dc24ccbf31b5c84cce0db6adca7622e1 /src/class.c | |
| parent | 5ed89a401c72e521806fef6143e12f77c16bf8b7 (diff) | |
| download | mruby-99e2035f42c0f29b316b335a91085ae6fbde5893.tar.gz mruby-99e2035f42c0f29b316b335a91085ae6fbde5893.zip | |
Modify mrb_vm_define_class.
* Check mismatch of superclass.
* Check constant value whose name is specified as a class's name.
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; } |
