summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorksss <[email protected]>2014-05-23 23:43:22 +0900
committerksss <[email protected]>2014-05-23 23:56:01 +0900
commit7fe34d8f496d2e9fa8f583dc6566b2f22c4077a6 (patch)
tree06d37663bc5a6a9dfb636f93457855be64204774 /src
parent5900bb376fde67e91d973030f8adc9cbb5374481 (diff)
downloadmruby-7fe34d8f496d2e9fa8f583dc6566b2f22c4077a6.tar.gz
mruby-7fe34d8f496d2e9fa8f583dc6566b2f22c4077a6.zip
Should not call inherited method
when class nothing
Diffstat (limited to 'src')
-rw-r--r--src/class.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/class.c b/src/class.c
index a5fe36c41..db9a8ac26 100644
--- a/src/class.c
+++ b/src/class.c
@@ -210,6 +210,14 @@ mrb_define_class(mrb_state *mrb, const char *name, struct RClass *super)
return mrb_define_class_id(mrb, mrb_intern_cstr(mrb, name), super);
}
+static void
+mrb_class_inherited(mrb_state *mrb, struct RClass *super, struct RClass *klass)
+{
+ if (!super)
+ super = mrb->object_class;
+ mrb_funcall(mrb, mrb_obj_value(super), "inherited", 1, mrb_obj_value(klass));
+}
+
struct RClass*
mrb_vm_define_class(mrb_state *mrb, mrb_value outer, mrb_value super, mrb_sym id)
{
@@ -235,7 +243,7 @@ mrb_vm_define_class(mrb_state *mrb, mrb_value outer, mrb_value super, mrb_sym id
break;
}
c = define_class(mrb, id, s, mrb_class_ptr(outer));
- mrb_funcall(mrb, mrb_obj_value(mrb_class_real(c->super)), "inherited", 1, mrb_obj_value(c));
+ mrb_class_inherited(mrb, mrb_class_real(c->super), c);
return c;
}
@@ -1119,7 +1127,7 @@ mrb_class_new_class(mrb_state *mrb, mrb_value cv)
}
new_class = mrb_obj_value(mrb_class_new(mrb, mrb_class_ptr(super)));
mrb_funcall_with_block(mrb, new_class, mrb_intern_lit(mrb, "initialize"), n, &super, blk);
- mrb_funcall(mrb, super, "inherited", 1, new_class);
+ mrb_class_inherited(mrb, mrb_class_ptr(super), mrb_class_ptr(new_class));
return new_class;
}
@@ -1287,6 +1295,8 @@ mrb_class_path(mrb_state *mrb, struct RClass *c)
struct RClass *
mrb_class_real(struct RClass* cl)
{
+ if (cl == 0)
+ return 0;
while ((cl->tt == MRB_TT_SCLASS) || (cl->tt == MRB_TT_ICLASS)) {
cl = cl->super;
}