diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2016-11-15 04:15:24 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2016-11-15 04:15:24 +0900 |
| commit | 4f6cce059b317f7e6c1da801fe0edd487985df6e (patch) | |
| tree | 336085a54439f3ac83abd97ba1bd2e0ed808c59a /src/class.c | |
| parent | 1422e5763005e50ce5f7874910e1a130a12091c9 (diff) | |
| download | mruby-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.c | 23 |
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); |
