mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
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:
@@ -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 {
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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 }
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user