object.h: separate frozen flag to the independent bit-field

So that other flag operation do not break frozen flag.
This commit is contained in:
Yukihiro "Matz" Matsumoto
2025-01-07 07:42:20 +09:00
parent a234c66c97
commit 21003746df
5 changed files with 13 additions and 12 deletions
+6 -5
View File
@@ -12,7 +12,8 @@
struct RBasic *gcnext; \
enum mrb_vtype tt:8; \
unsigned int gccolor:3; \
uint32_t flags:21
unsigned int frozen:1; \
uint32_t flags:20
#define MRB_FLAG_TEST(obj, flag) ((obj)->flags & (flag))
@@ -21,10 +22,10 @@ struct RBasic {
};
#define mrb_basic_ptr(v) ((struct RBasic*)(mrb_ptr(v)))
#define MRB_FL_OBJ_IS_FROZEN (1 << 20)
#define MRB_FROZEN_P(o) ((o)->flags & MRB_FL_OBJ_IS_FROZEN)
#define MRB_SET_FROZEN_FLAG(o) ((o)->flags |= MRB_FL_OBJ_IS_FROZEN)
#define MRB_UNSET_FROZEN_FLAG(o) ((o)->flags &= ~MRB_FL_OBJ_IS_FROZEN)
#define MRB_OBJ_IS_FROZEN 1
#define MRB_FROZEN_P(o) ((o)->frozen)
#define MRB_SET_FROZEN_FLAG(o) ((o)->frozen = 1)
#define MRB_UNSET_FROZEN_FLAG(o) ((o)->frozen = 0)
#define mrb_frozen_p(o) MRB_FROZEN_P(o)
struct RObject {
+1 -1
View File
@@ -39,7 +39,7 @@ static const mrb_irep catch_irep = {
};
mrb_alignas(8)
static const struct RProc catch_proc = {
NULL, NULL, MRB_TT_PROC, MRB_GC_RED, MRB_FL_OBJ_IS_FROZEN | MRB_PROC_SCOPE | MRB_PROC_STRICT,
NULL, NULL, MRB_TT_PROC, MRB_GC_RED, MRB_OBJ_IS_FROZEN, MRB_PROC_SCOPE | MRB_PROC_STRICT,
{ &catch_irep }, NULL, { NULL }
};
+1 -1
View File
@@ -452,7 +452,7 @@ mrb_dump_irep_cstruct(mrb_state *mrb, const mrb_irep *irep, uint8_t flags, FILE
"extern\n"
"#endif",
initname);
fprintf(fp, "NULL,NULL,MRB_TT_PROC,MRB_GC_RED,0,{&%s_irep_0},NULL,{NULL},\n}};\n", initname);
fprintf(fp, "NULL,NULL,MRB_TT_PROC,MRB_GC_RED,MRB_OBJ_IS_FROZEN,0,{&%s_irep_0},NULL,{NULL},\n}};\n", initname);
fputs("static void\n", fp);
fprintf(fp, "%s_init_syms(mrb_state *mrb)\n", initname);
fputs("{\n", fp);
+4 -4
View File
@@ -387,7 +387,7 @@ prepare_singleton_class(mrb_state *mrb, struct RBasic *o)
o->c = sc;
mrb_field_write_barrier(mrb, (struct RBasic*)o, (struct RBasic*)sc);
mrb_obj_iv_set(mrb, (struct RObject*)sc, MRB_SYM(__attached__), mrb_obj_value(o));
sc->flags |= o->flags & MRB_FL_OBJ_IS_FROZEN;
sc->frozen = o->frozen;
}
static mrb_value
@@ -2686,7 +2686,7 @@ copy_class(mrb_state *mrb, mrb_value dst, mrb_value src)
}
dc->super = sc->super;
dc->flags = sc->flags;
dc->flags &= ~MRB_FL_OBJ_IS_FROZEN;
dc->frozen = 0;
}
/* 15.3.1.3.16 */
@@ -2789,7 +2789,7 @@ mrb_obj_clone(mrb_state *mrb, mrb_value self)
mrb_value clone = mrb_obj_value(p);
init_copy(mrb, clone, self);
p->flags |= mrb_obj_ptr(self)->flags & MRB_FL_OBJ_IS_FROZEN;
p->frozen = mrb_obj_ptr(self)->frozen;
return clone;
}
@@ -2913,7 +2913,7 @@ static const mrb_irep new_irep = {
mrb_alignas(8)
static const struct RProc new_proc = {
NULL, NULL, MRB_TT_PROC, MRB_GC_RED, MRB_FL_OBJ_IS_FROZEN | MRB_PROC_SCOPE | MRB_PROC_STRICT,
NULL, NULL, MRB_TT_PROC, MRB_GC_RED, MRB_OBJ_IS_FROZEN, MRB_PROC_SCOPE | MRB_PROC_STRICT,
{ &new_irep }, NULL, { NULL }
};
+1 -1
View File
@@ -38,7 +38,7 @@ static const mrb_irep call_irep = {
mrb_alignas(8)
static const struct RProc call_proc = {
NULL, NULL, MRB_TT_PROC, MRB_GC_RED, MRB_FL_OBJ_IS_FROZEN | MRB_PROC_SCOPE | MRB_PROC_STRICT,
NULL, NULL, MRB_TT_PROC, MRB_GC_RED, MRB_OBJ_IS_FROZEN, MRB_PROC_SCOPE | MRB_PROC_STRICT,
{ &call_irep }, NULL, { NULL }
};