summaryrefslogtreecommitdiffhomepage
path: root/src/class.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2012-07-29 01:56:50 -0700
committerYukihiro "Matz" Matsumoto <[email protected]>2012-07-29 01:56:50 -0700
commitfccd2d4cf0b5566b821824f7682e89e0b7a9f9ef (patch)
treedcc83cf727f0537900d700814b38c620f3e2fd39 /src/class.c
parent622b3f010b7d32a092e56ed3b99744cc70d7972f (diff)
parentb71063b239cbbdbdd6779d7b590c0cad59e0c3ae (diff)
downloadmruby-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.c37
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;
}