@@ -1814,17 +1814,19 @@ mrb_get_args_a(mrb_state *mrb, mrb_args_format format, void **args)
18141814}
18151815
18161816static struct RClass *
1817- boot_defclass (mrb_state * mrb , struct RClass * super )
1817+ boot_defclass (mrb_state * mrb , struct RClass * super , enum mrb_vtype tt )
18181818{
18191819 struct RClass * c = MRB_OBJ_ALLOC (mrb , MRB_TT_CLASS , mrb -> class_class );
1820+ MRB_SET_INSTANCE_TT (c , tt );
18201821
18211822 if (super ) {
18221823 c -> super = super ;
18231824 mrb_field_write_barrier (mrb , (struct RBasic * )c , (struct RBasic * )super );
18241825 c -> flags |= MRB_FL_CLASS_IS_INHERITED ;
18251826 }
18261827 else {
1827- c -> super = mrb -> object_class ;
1828+ // limited to cases where BasicObject class is defined during mruby initialization
1829+ mrb_assert (mrb -> object_class == NULL );
18281830 }
18291831 c -> mt = mt_new (mrb );
18301832 return c ;
@@ -3134,12 +3136,12 @@ mrb_class_new(mrb_state *mrb, struct RClass *super)
31343136 if (super ) {
31353137 mrb_check_inheritable (mrb , super );
31363138 }
3137-
3138- struct RClass * c = boot_defclass (mrb , super );
3139- if (super ) {
3140- MRB_SET_INSTANCE_TT (c , MRB_INSTANCE_TT (super ));
3141- c -> flags |= super -> flags & MRB_FL_UNDEF_ALLOCATE ;
3139+ else {
3140+ super = mrb -> object_class ;
31423141 }
3142+
3143+ struct RClass * c = boot_defclass (mrb , super , MRB_INSTANCE_TT (super ));
3144+ c -> flags |= super -> flags & MRB_FL_UNDEF_ALLOCATE ;
31433145 make_metaclass (mrb , c );
31443146
31453147 return c ;
@@ -4188,10 +4190,11 @@ mrb_init_class(mrb_state *mrb)
41884190 struct RClass * cls ; /* Class */
41894191
41904192 /* boot class hierarchy */
4191- bob = boot_defclass (mrb , 0 );
4192- obj = boot_defclass (mrb , bob ); mrb -> object_class = obj ;
4193- mod = boot_defclass (mrb , obj ); mrb -> module_class = mod ;/* obj -> mod */
4194- cls = boot_defclass (mrb , mod ); mrb -> class_class = cls ; /* obj -> cls */
4193+ bob = boot_defclass (mrb , 0 , MRB_TT_OBJECT );
4194+ obj = boot_defclass (mrb , bob , MRB_TT_OBJECT ); mrb -> object_class = obj ;
4195+ mod = boot_defclass (mrb , obj , MRB_TT_MODULE ); mrb -> module_class = mod ;/* obj -> mod */
4196+ cls = boot_defclass (mrb , mod , MRB_TT_CLASS ); mrb -> class_class = cls ; /* obj -> cls */
4197+
41954198 /* fix-up loose ends */
41964199 bob -> c = obj -> c = mod -> c = cls -> c = cls ;
41974200 make_metaclass (mrb , bob );
@@ -4211,7 +4214,6 @@ mrb_init_class(mrb_state *mrb)
42114214 mrb_class_name_class (mrb , NULL , mod , MRB_SYM (Module )); /* 15.2.2 */
42124215 mrb_class_name_class (mrb , NULL , cls , MRB_SYM (Class )); /* 15.2.3 */
42134216
4214- MRB_SET_INSTANCE_TT (cls , MRB_TT_CLASS );
42154217 mrb_define_method_id (mrb , bob , MRB_SYM (initialize ), mrb_do_nothing , MRB_ARGS_NONE ());
42164218 mrb_define_method_id (mrb , bob , MRB_OPSYM (not ), mrb_bob_not , MRB_ARGS_NONE ());
42174219 mrb_define_method_id (mrb , bob , MRB_OPSYM (eq ), mrb_obj_equal_m , MRB_ARGS_REQ (1 )); /* 15.3.1.3.1 */
@@ -4236,7 +4238,6 @@ mrb_init_class(mrb_state *mrb)
42364238
42374239 init_class_new (mrb , cls );
42384240
4239- MRB_SET_INSTANCE_TT (mod , MRB_TT_MODULE );
42404241 mrb_define_private_method_id (mrb , mod , MRB_SYM (extended ), mrb_do_nothing , MRB_ARGS_REQ (1 )); /* 15.2.2.4.26 */
42414242 mrb_define_private_method_id (mrb , mod , MRB_SYM (prepended ), mrb_do_nothing , MRB_ARGS_REQ (1 ));
42424243 mrb_define_method_id (mrb , mod , MRB_SYM_Q (include ), mrb_mod_include_p , MRB_ARGS_REQ (1 )); /* 15.2.2.4.28 */
0 commit comments