mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
class/module statement should re-open; fix #3225
This commit is contained in:
+23
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user