Skip to content

Commit 54ee911

Browse files
authored
Merge pull request mruby#6582 from dearblue/type-tag
2 parents 7b56f13 + bd0f111 commit 54ee911

2 files changed

Lines changed: 17 additions & 16 deletions

File tree

src/class.c

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1814,17 +1814,19 @@ mrb_get_args_a(mrb_state *mrb, mrb_args_format format, void **args)
18141814
}
18151815

18161816
static 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 */

src/gc.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -482,12 +482,12 @@ mrb_obj_alloc(mrb_state *mrb, enum mrb_vtype ttype, struct RClass *cls)
482482
mrb_raise(mrb, E_TYPE_ERROR, "allocation failure");
483483
}
484484
tt = MRB_INSTANCE_TT(cls);
485-
if (tt != MRB_TT_FALSE &&
486-
ttype != MRB_TT_SCLASS &&
485+
if (ttype != MRB_TT_SCLASS &&
487486
ttype != MRB_TT_ICLASS &&
488487
ttype != MRB_TT_ENV &&
489488
ttype != MRB_TT_BIGINT &&
490-
ttype != tt) {
489+
ttype != tt &&
490+
!(cls == mrb->object_class && (ttype == MRB_TT_CPTR || ttype == MRB_TT_CDATA || ttype == MRB_TT_ISTRUCT))) {
491491
mrb_raisef(mrb, E_TYPE_ERROR, "allocation failure of %C", cls);
492492
}
493493
}

0 commit comments

Comments
 (0)