Skip to content

Commit 2100374

Browse files
committed
object.h: separate frozen flag to the independent bit-field
So that other flag operation do not break frozen flag.
1 parent a234c66 commit 2100374

5 files changed

Lines changed: 13 additions & 12 deletions

File tree

include/mruby/object.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
struct RBasic *gcnext; \
1313
enum mrb_vtype tt:8; \
1414
unsigned int gccolor:3; \
15-
uint32_t flags:21
15+
unsigned int frozen:1; \
16+
uint32_t flags:20
1617

1718
#define MRB_FLAG_TEST(obj, flag) ((obj)->flags & (flag))
1819

@@ -21,10 +22,10 @@ struct RBasic {
2122
};
2223
#define mrb_basic_ptr(v) ((struct RBasic*)(mrb_ptr(v)))
2324

24-
#define MRB_FL_OBJ_IS_FROZEN (1 << 20)
25-
#define MRB_FROZEN_P(o) ((o)->flags & MRB_FL_OBJ_IS_FROZEN)
26-
#define MRB_SET_FROZEN_FLAG(o) ((o)->flags |= MRB_FL_OBJ_IS_FROZEN)
27-
#define MRB_UNSET_FROZEN_FLAG(o) ((o)->flags &= ~MRB_FL_OBJ_IS_FROZEN)
25+
#define MRB_OBJ_IS_FROZEN 1
26+
#define MRB_FROZEN_P(o) ((o)->frozen)
27+
#define MRB_SET_FROZEN_FLAG(o) ((o)->frozen = 1)
28+
#define MRB_UNSET_FROZEN_FLAG(o) ((o)->frozen = 0)
2829
#define mrb_frozen_p(o) MRB_FROZEN_P(o)
2930

3031
struct RObject {

mrbgems/mruby-catch/src/catch.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ static const mrb_irep catch_irep = {
3939
};
4040
mrb_alignas(8)
4141
static const struct RProc catch_proc = {
42-
NULL, NULL, MRB_TT_PROC, MRB_GC_RED, MRB_FL_OBJ_IS_FROZEN | MRB_PROC_SCOPE | MRB_PROC_STRICT,
42+
NULL, NULL, MRB_TT_PROC, MRB_GC_RED, MRB_OBJ_IS_FROZEN, MRB_PROC_SCOPE | MRB_PROC_STRICT,
4343
{ &catch_irep }, NULL, { NULL }
4444
};
4545

src/cdump.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,7 @@ mrb_dump_irep_cstruct(mrb_state *mrb, const mrb_irep *irep, uint8_t flags, FILE
452452
"extern\n"
453453
"#endif",
454454
initname);
455-
fprintf(fp, "NULL,NULL,MRB_TT_PROC,MRB_GC_RED,0,{&%s_irep_0},NULL,{NULL},\n}};\n", initname);
455+
fprintf(fp, "NULL,NULL,MRB_TT_PROC,MRB_GC_RED,MRB_OBJ_IS_FROZEN,0,{&%s_irep_0},NULL,{NULL},\n}};\n", initname);
456456
fputs("static void\n", fp);
457457
fprintf(fp, "%s_init_syms(mrb_state *mrb)\n", initname);
458458
fputs("{\n", fp);

src/class.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,7 @@ prepare_singleton_class(mrb_state *mrb, struct RBasic *o)
387387
o->c = sc;
388388
mrb_field_write_barrier(mrb, (struct RBasic*)o, (struct RBasic*)sc);
389389
mrb_obj_iv_set(mrb, (struct RObject*)sc, MRB_SYM(__attached__), mrb_obj_value(o));
390-
sc->flags |= o->flags & MRB_FL_OBJ_IS_FROZEN;
390+
sc->frozen = o->frozen;
391391
}
392392

393393
static mrb_value
@@ -2686,7 +2686,7 @@ copy_class(mrb_state *mrb, mrb_value dst, mrb_value src)
26862686
}
26872687
dc->super = sc->super;
26882688
dc->flags = sc->flags;
2689-
dc->flags &= ~MRB_FL_OBJ_IS_FROZEN;
2689+
dc->frozen = 0;
26902690
}
26912691

26922692
/* 15.3.1.3.16 */
@@ -2789,7 +2789,7 @@ mrb_obj_clone(mrb_state *mrb, mrb_value self)
27892789

27902790
mrb_value clone = mrb_obj_value(p);
27912791
init_copy(mrb, clone, self);
2792-
p->flags |= mrb_obj_ptr(self)->flags & MRB_FL_OBJ_IS_FROZEN;
2792+
p->frozen = mrb_obj_ptr(self)->frozen;
27932793

27942794
return clone;
27952795
}
@@ -2913,7 +2913,7 @@ static const mrb_irep new_irep = {
29132913

29142914
mrb_alignas(8)
29152915
static const struct RProc new_proc = {
2916-
NULL, NULL, MRB_TT_PROC, MRB_GC_RED, MRB_FL_OBJ_IS_FROZEN | MRB_PROC_SCOPE | MRB_PROC_STRICT,
2916+
NULL, NULL, MRB_TT_PROC, MRB_GC_RED, MRB_OBJ_IS_FROZEN, MRB_PROC_SCOPE | MRB_PROC_STRICT,
29172917
{ &new_irep }, NULL, { NULL }
29182918
};
29192919

src/proc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ static const mrb_irep call_irep = {
3838

3939
mrb_alignas(8)
4040
static const struct RProc call_proc = {
41-
NULL, NULL, MRB_TT_PROC, MRB_GC_RED, MRB_FL_OBJ_IS_FROZEN | MRB_PROC_SCOPE | MRB_PROC_STRICT,
41+
NULL, NULL, MRB_TT_PROC, MRB_GC_RED, MRB_OBJ_IS_FROZEN, MRB_PROC_SCOPE | MRB_PROC_STRICT,
4242
{ &call_irep }, NULL, { NULL }
4343
};
4444

0 commit comments

Comments
 (0)