summaryrefslogtreecommitdiffhomepage
path: root/src/class.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2016-11-15 04:15:24 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2016-11-15 04:15:24 +0900
commit4f6cce059b317f7e6c1da801fe0edd487985df6e (patch)
tree336085a54439f3ac83abd97ba1bd2e0ed808c59a /src/class.c
parent1422e5763005e50ce5f7874910e1a130a12091c9 (diff)
downloadmruby-4f6cce059b317f7e6c1da801fe0edd487985df6e.tar.gz
mruby-4f6cce059b317f7e6c1da801fe0edd487985df6e.zip
class/module statement should re-open; fix #3225
Diffstat (limited to 'src/class.c')
-rw-r--r--src/class.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/class.c b/src/class.c
index d044cb68a..e5d60a693 100644
--- a/src/class.c
+++ b/src/class.c
@@ -174,6 +174,14 @@ MRB_API struct RClass*
mrb_vm_define_module(mrb_state *mrb, mrb_value outer, mrb_sym id)
{
check_if_class_or_module(mrb, outer);
+ if (mrb_const_defined_at(mrb, outer, id)) {
+ mrb_value old = mrb_const_get(mrb, outer, id);
+
+ if (mrb_type(old) != MRB_TT_MODULE) {
+ mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a module", mrb_inspect(mrb, old));
+ }
+ return mrb_class_ptr(old);
+ }
return define_module(mrb, id, mrb_class_ptr(outer));
}
@@ -255,6 +263,21 @@ mrb_vm_define_class(mrb_state *mrb, mrb_value outer, mrb_value super, mrb_sym id
s = 0;
}
check_if_class_or_module(mrb, outer);
+ if (mrb_const_defined_at(mrb, outer, id)) {
+ mrb_value old = mrb_const_get(mrb, outer, id);
+
+ if (mrb_type(old) != MRB_TT_CLASS) {
+ mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a class", mrb_inspect(mrb, old));
+ }
+ c = mrb_class_ptr(old);
+ if (s) {
+ /* check super class */
+ if (mrb_class_real(c->super) != s) {
+ mrb_raisef(mrb, E_TYPE_ERROR, "superclass mismatch for class %S", old);
+ }
+ }
+ return c;
+ }
c = define_class(mrb, id, s, mrb_class_ptr(outer));
mrb_class_inherited(mrb, mrb_class_real(c->super), c);