mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
add read barrier to value.p
API changes: - value.p must be accessed via mrb_value_p macro - value.p must be mutated via MRB_SET_VALUE_P macro
This commit is contained in:
@@ -27,9 +27,9 @@ struct RArray {
|
||||
mrb_value *ptr;
|
||||
};
|
||||
|
||||
#define mrb_ary_ptr(v) ((struct RArray*)((v).value.p))
|
||||
#define mrb_ary_ptr(v) ((struct RArray*)(mrb_value_p(v)))
|
||||
#define mrb_ary_value(p) mrb_obj_value((void*)(p))
|
||||
#define RARRAY(v) ((struct RArray*)((v).value.p))
|
||||
#define RARRAY(v) ((struct RArray*)(mrb_value_p(v)))
|
||||
|
||||
#define RARRAY_LEN(a) (RARRAY(a)->len)
|
||||
#define RARRAY_PTR(a) (RARRAY(a)->ptr)
|
||||
|
||||
@@ -18,10 +18,10 @@ struct RClass {
|
||||
struct RClass *super;
|
||||
};
|
||||
|
||||
#define mrb_class_ptr(v) ((struct RClass*)((v).value.p))
|
||||
#define RCLASS_SUPER(v) (((struct RClass*)((v).value.p))->super)
|
||||
#define RCLASS_IV_TBL(v) (((struct RClass*)((v).value.p))->iv)
|
||||
#define RCLASS_M_TBL(v) (((struct RClass*)((v).value.p))->mt)
|
||||
#define mrb_class_ptr(v) ((struct RClass*)(mrb_value_p(v)))
|
||||
#define RCLASS_SUPER(v) (((struct RClass*)(mrb_value_p(v)))->super)
|
||||
#define RCLASS_IV_TBL(v) (((struct RClass*)(mrb_value_p(v)))->iv)
|
||||
#define RCLASS_M_TBL(v) (((struct RClass*)(mrb_value_p(v)))->mt)
|
||||
|
||||
static inline struct RClass*
|
||||
mrb_class(mrb_state *mrb, mrb_value v)
|
||||
|
||||
@@ -34,7 +34,7 @@ struct RData *mrb_data_object_alloc(mrb_state *mrb, struct RClass* klass, void *
|
||||
data = Data_Wrap_Struct(mrb,klass,type,sval);\
|
||||
} while (0)
|
||||
|
||||
#define RDATA(obj) ((struct RData *)((obj).value.p))
|
||||
#define RDATA(obj) ((struct RData *)(mrb_value_p(obj)))
|
||||
#define DATA_PTR(d) (RDATA(d)->data)
|
||||
#define DATA_TYPE(d) (RDATA(d)->type)
|
||||
void mrb_data_check_type(mrb_state *mrb, mrb_value, const mrb_data_type*);
|
||||
|
||||
@@ -17,7 +17,7 @@ struct RHash {
|
||||
struct kh_ht *ht;
|
||||
};
|
||||
|
||||
#define mrb_hash_ptr(v) ((struct RHash*)((v).value.p))
|
||||
#define mrb_hash_ptr(v) ((struct RHash*)(mrb_value_p(v)))
|
||||
#define mrb_hash_value(p) mrb_obj_value((void*)(p))
|
||||
|
||||
mrb_value mrb_hash_new_capa(mrb_state*, int);
|
||||
@@ -33,7 +33,7 @@ mrb_value mrb_hash_empty_p(mrb_state *mrb, mrb_value self);
|
||||
mrb_value mrb_hash_clear(mrb_state *mrb, mrb_value hash);
|
||||
|
||||
/* RHASH_TBL allocates st_table if not available. */
|
||||
#define RHASH(obj) ((struct RHash*)((obj).value.p))
|
||||
#define RHASH(obj) ((struct RHash*)(mrb_value_p(obj)))
|
||||
#define RHASH_TBL(h) (RHASH(h)->ht)
|
||||
#define RHASH_IFNONE(h) mrb_iv_get(mrb, (h), mrb_intern2(mrb, "ifnone", 6))
|
||||
#define RHASH_PROCDEFAULT(h) RHASH_IFNONE(h)
|
||||
|
||||
@@ -44,7 +44,7 @@ struct RProc {
|
||||
#define MRB_PROC_STRICT 256
|
||||
#define MRB_PROC_STRICT_P(p) (((p)->flags & MRB_PROC_STRICT) != 0)
|
||||
|
||||
#define mrb_proc_ptr(v) ((struct RProc*)((v).value.p))
|
||||
#define mrb_proc_ptr(v) ((struct RProc*)(mrb_value_p(v)))
|
||||
|
||||
struct RProc *mrb_proc_new(mrb_state*, mrb_irep*);
|
||||
struct RProc *mrb_proc_new_cfunc(mrb_state*, mrb_func_t);
|
||||
|
||||
@@ -22,7 +22,7 @@ struct RRange {
|
||||
int excl;
|
||||
};
|
||||
|
||||
#define mrb_range_ptr(v) ((struct RRange*)((v).value.p))
|
||||
#define mrb_range_ptr(v) ((struct RRange*)(mrb_value_p(v)))
|
||||
#define mrb_range_value(p) mrb_obj_value((void*)(p))
|
||||
|
||||
mrb_value mrb_range_new(mrb_state*, mrb_value, mrb_value, int);
|
||||
|
||||
@@ -25,8 +25,8 @@ struct RString {
|
||||
char *ptr;
|
||||
};
|
||||
|
||||
#define mrb_str_ptr(s) ((struct RString*)((s).value.p))
|
||||
#define RSTRING(s) ((struct RString*)((s).value.p))
|
||||
#define mrb_str_ptr(s) ((struct RString*)(mrb_value_p(s)))
|
||||
#define RSTRING(s) ((struct RString*)(mrb_value_p(s)))
|
||||
#define RSTRING_PTR(s) (RSTRING(s)->ptr)
|
||||
#define RSTRING_LEN(s) (RSTRING(s)->len)
|
||||
#define RSTRING_CAPA(s) (RSTRING(s)->aux.capa)
|
||||
|
||||
+18
-15
@@ -142,15 +142,17 @@ typedef struct mrb_value {
|
||||
};
|
||||
} mrb_value;
|
||||
|
||||
#define mrb_tt(o) ((o).ttt & 0xff)
|
||||
#define mrb_mktt(tt) (0xfff00000|(tt))
|
||||
#define mrb_type(o) ((uint32_t)0xfff00000 < (o).ttt ? mrb_tt(o) : MRB_TT_FLOAT)
|
||||
#define mrb_float(o) (o).f
|
||||
#define mrb_tt(o) ((o).ttt & 0xff)
|
||||
#define mrb_mktt(tt) (0xfff00000|(tt))
|
||||
#define mrb_type(o) ((uint32_t)0xfff00000 < (o).ttt ? mrb_tt(o) : MRB_TT_FLOAT)
|
||||
#define mrb_value_p(o) (o).value.p
|
||||
#define mrb_float(o) (o).f
|
||||
|
||||
#define MRB_SET_VALUE(o, tt, attr, v) do {\
|
||||
(o).ttt = mrb_mktt(tt);\
|
||||
(o).attr = v;\
|
||||
} while (0)
|
||||
#define MRB_SET_VALUE_P(o, tt, v) MRB_SET_VALUE(o, tt, value.p, v)
|
||||
|
||||
static inline mrb_value
|
||||
mrb_float_value(struct mrb_state *mrb, mrb_float f)
|
||||
@@ -229,7 +231,8 @@ typedef union mrb_value {
|
||||
unsigned long w;
|
||||
} mrb_value;
|
||||
|
||||
#define mrb_float(o) (o).value.fp->f
|
||||
#define mrb_value_p(o) (o).value.p
|
||||
#define mrb_float(o) (o).value.fp->f
|
||||
|
||||
#define MRB_SET_VALUE(o, ttt, attr, v) do {\
|
||||
(o).w = 0;\
|
||||
@@ -243,6 +246,7 @@ typedef union mrb_value {
|
||||
default: if ((o).value.bp) (o).value.bp->tt = ttt; break;\
|
||||
}\
|
||||
} while (0)
|
||||
#define MRB_SET_VALUE_P(o, ttt, v) MRB_SET_VALUE(o, ttt, value.p, v)
|
||||
|
||||
extern mrb_value
|
||||
mrb_float_value(struct mrb_state *mrb, mrb_float f);
|
||||
@@ -261,13 +265,15 @@ typedef struct mrb_value {
|
||||
enum mrb_vtype tt;
|
||||
} mrb_value;
|
||||
|
||||
#define mrb_type(o) (o).tt
|
||||
#define mrb_float(o) (o).value.f
|
||||
#define mrb_type(o) (o).tt
|
||||
#define mrb_value_p(o) (o).value.p
|
||||
#define mrb_float(o) (o).value.f
|
||||
|
||||
#define MRB_SET_VALUE(o, ttt, attr, v) do {\
|
||||
(o).tt = ttt;\
|
||||
(o).attr = v;\
|
||||
} while (0)
|
||||
#define MRB_SET_VALUE_P(o, ttt, v) MRB_SET_VALUE(o, ttt, value.p, v)
|
||||
|
||||
static inline mrb_value
|
||||
mrb_float_value(struct mrb_state *mrb, mrb_float f)
|
||||
@@ -291,8 +297,7 @@ mrb_float_value(struct mrb_state *mrb, mrb_float f)
|
||||
#define mrb_bool(o) ((o).w != MRB_Qnil && (o).w != MRB_Qfalse)
|
||||
|
||||
#else
|
||||
|
||||
#define mrb_voidp(o) (o).value.p
|
||||
#define mrb_voidp(o) mrb_value_p(o)
|
||||
#define mrb_fixnum_p(o) (mrb_type(o) == MRB_TT_FIXNUM)
|
||||
#define mrb_undef_p(o) (mrb_type(o) == MRB_TT_UNDEF)
|
||||
#define mrb_nil_p(o) (mrb_type(o) == MRB_TT_FALSE && !(o).value.i)
|
||||
@@ -339,8 +344,7 @@ mrb_float_value(struct mrb_state *mrb, mrb_float f)
|
||||
struct RBasic {
|
||||
MRB_OBJECT_HEADER;
|
||||
};
|
||||
|
||||
#define mrb_basic_ptr(v) ((struct RBasic*)((v).value.p))
|
||||
#define mrb_basic_ptr(v) ((struct RBasic*)(mrb_value_p(v)))
|
||||
/* obsolete macro mrb_basic; will be removed soon */
|
||||
#define mrb_basic(v) mrb_basic_ptr(v)
|
||||
|
||||
@@ -348,8 +352,7 @@ struct RObject {
|
||||
MRB_OBJECT_HEADER;
|
||||
struct iv_tbl *iv;
|
||||
};
|
||||
|
||||
#define mrb_obj_ptr(v) ((struct RObject*)((v).value.p))
|
||||
#define mrb_obj_ptr(v) ((struct RObject*)(mrb_value_p(v)))
|
||||
/* obsolete macro mrb_object; will be removed soon */
|
||||
#define mrb_object(o) mrb_obj_ptr(o)
|
||||
#define mrb_immediate_p(x) (mrb_type(x) <= MRB_TT_VOIDP)
|
||||
@@ -417,7 +420,7 @@ mrb_obj_value(void *p)
|
||||
mrb_value v;
|
||||
struct RBasic *b = (struct RBasic*)p;
|
||||
|
||||
MRB_SET_VALUE(v, b->tt, value.p, p);
|
||||
MRB_SET_VALUE_P(v, b->tt, p);
|
||||
return v;
|
||||
}
|
||||
|
||||
@@ -430,7 +433,7 @@ mrb_voidp_value(struct mrb_state *mrb, void *p)
|
||||
{
|
||||
mrb_value v;
|
||||
|
||||
MRB_SET_VALUE(v, MRB_TT_VOIDP, value.p, p);
|
||||
MRB_SET_VALUE_P(v, MRB_TT_VOIDP, p);
|
||||
return v;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -62,7 +62,7 @@ static mrb_value
|
||||
fiber_init(mrb_state *mrb, mrb_value self)
|
||||
{
|
||||
static const struct mrb_context mrb_context_zero = { 0 };
|
||||
struct RFiber *f = (struct RFiber*)self.value.p;
|
||||
struct RFiber *f = (struct RFiber*)mrb_value_p(self);
|
||||
struct mrb_context *c;
|
||||
struct RProc *p;
|
||||
mrb_callinfo *ci;
|
||||
@@ -113,7 +113,7 @@ fiber_init(mrb_state *mrb, mrb_value self)
|
||||
static struct mrb_context*
|
||||
fiber_check(mrb_state *mrb, mrb_value fib)
|
||||
{
|
||||
struct RFiber *f = (struct RFiber*)fib.value.p;
|
||||
struct RFiber *f = (struct RFiber*)mrb_value_p(fib);
|
||||
|
||||
if (!f->cxt) {
|
||||
mrb_raise(mrb, E_ARGUMENT_ERROR, "uninitialized Fiber");
|
||||
|
||||
+1
-1
@@ -1438,7 +1438,7 @@ undef_method(mrb_state *mrb, struct RClass *c, mrb_sym a)
|
||||
mrb_name_error(mrb, a, "undefined method '%S' for class '%S'", mrb_sym2str(mrb, a), mrb_obj_value(c));
|
||||
}
|
||||
else {
|
||||
MRB_SET_VALUE(m, MRB_TT_PROC, value.p, 0);
|
||||
MRB_SET_VALUE_P(m, MRB_TT_PROC, 0);
|
||||
mrb_define_method_vm(mrb, c, a, m);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -176,7 +176,7 @@ mrb_obj_id(mrb_value obj)
|
||||
case MRB_TT_FILE:
|
||||
case MRB_TT_DATA:
|
||||
default:
|
||||
return MakeID(obj.value.p);
|
||||
return MakeID(mrb_value_p(obj));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -29,7 +29,7 @@ mrb_obj_eq(mrb_state *mrb, mrb_value v1, mrb_value v2)
|
||||
return (mrb_float(v1) == mrb_float(v2));
|
||||
|
||||
default:
|
||||
return (v1.value.p == v2.value.p);
|
||||
return (mrb_value_p(v1) == mrb_value_p(v2));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ void abort(void);
|
||||
#define SET_NIL_VALUE(r) MRB_SET_VALUE(r, MRB_TT_FALSE, value.i, 0)
|
||||
#define SET_INT_VALUE(r,n) MRB_SET_VALUE(r, MRB_TT_FIXNUM, value.i, (n))
|
||||
#define SET_SYM_VALUE(r,v) MRB_SET_VALUE(r, MRB_TT_SYMBOL, value.sym, (v))
|
||||
#define SET_OBJ_VALUE(r,v) MRB_SET_VALUE(r, (((struct RObject*)(v))->tt), value.p, (v))
|
||||
#define SET_OBJ_VALUE(r,v) MRB_SET_VALUE_P(r, (((struct RObject*)(v))->tt), (v))
|
||||
#ifdef MRB_NAN_BOXING
|
||||
#define SET_FLT_VALUE(mrb,r,v) r.f = (v)
|
||||
#elif defined(MRB_WORD_BOXING)
|
||||
|
||||
Reference in New Issue
Block a user