From 21003746df2bc1d83fe507e2b0f95b501d2938f4 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 7 Jan 2025 07:42:20 +0900 Subject: [PATCH] object.h: separate frozen flag to the independent bit-field So that other flag operation do not break frozen flag. --- include/mruby/object.h | 11 ++++++----- mrbgems/mruby-catch/src/catch.c | 2 +- src/cdump.c | 2 +- src/class.c | 8 ++++---- src/proc.c | 2 +- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/include/mruby/object.h b/include/mruby/object.h index 5a8e207f6..912a4a225 100644 --- a/include/mruby/object.h +++ b/include/mruby/object.h @@ -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 { diff --git a/mrbgems/mruby-catch/src/catch.c b/mrbgems/mruby-catch/src/catch.c index ab1972802..c116de9be 100644 --- a/mrbgems/mruby-catch/src/catch.c +++ b/mrbgems/mruby-catch/src/catch.c @@ -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 } }; diff --git a/src/cdump.c b/src/cdump.c index fcb9e75aa..05d852840 100644 --- a/src/cdump.c +++ b/src/cdump.c @@ -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); diff --git a/src/class.c b/src/class.c index 096dd4a63..40f1ff171 100644 --- a/src/class.c +++ b/src/class.c @@ -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 } }; diff --git a/src/proc.c b/src/proc.c index d020abe0a..4ef80a052 100644 --- a/src/proc.c +++ b/src/proc.c @@ -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 } };