diff options
| author | Yuichi Nishiwaki <[email protected]> | 2013-08-03 14:03:44 -0700 |
|---|---|---|
| committer | Yuichi Nishiwaki <[email protected]> | 2013-08-03 14:03:44 -0700 |
| commit | 8dc2fa3bc8233d51d546359fcba89afe56892f1f (patch) | |
| tree | 726f7d71c9d2c56c2d178e72b4cd33f0a6dcc779 | |
| parent | 9b4d0718333f30a563b3df8c03aca5d78e04437f (diff) | |
| download | mruby-8dc2fa3bc8233d51d546359fcba89afe56892f1f.tar.gz mruby-8dc2fa3bc8233d51d546359fcba89afe56892f1f.zip | |
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
| -rw-r--r-- | include/mruby/array.h | 4 | ||||
| -rw-r--r-- | include/mruby/class.h | 8 | ||||
| -rw-r--r-- | include/mruby/data.h | 2 | ||||
| -rw-r--r-- | include/mruby/hash.h | 4 | ||||
| -rw-r--r-- | include/mruby/proc.h | 2 | ||||
| -rw-r--r-- | include/mruby/range.h | 2 | ||||
| -rw-r--r-- | include/mruby/string.h | 4 | ||||
| -rw-r--r-- | include/mruby/value.h | 33 | ||||
| -rw-r--r-- | mrbgems/mruby-fiber/src/fiber.c | 4 | ||||
| -rw-r--r-- | src/class.c | 2 | ||||
| -rw-r--r-- | src/etc.c | 2 | ||||
| -rw-r--r-- | src/object.c | 2 | ||||
| -rw-r--r-- | src/vm.c | 2 |
13 files changed, 37 insertions, 34 deletions
diff --git a/include/mruby/array.h b/include/mruby/array.h index d52ca1596..f7fabf3b1 100644 --- a/include/mruby/array.h +++ b/include/mruby/array.h @@ -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) diff --git a/include/mruby/class.h b/include/mruby/class.h index 4ab954d9e..45b48fc1a 100644 --- a/include/mruby/class.h +++ b/include/mruby/class.h @@ -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) diff --git a/include/mruby/data.h b/include/mruby/data.h index c6b380f28..ad3f279c9 100644 --- a/include/mruby/data.h +++ b/include/mruby/data.h @@ -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*); diff --git a/include/mruby/hash.h b/include/mruby/hash.h index c331db157..92e77bdb9 100644 --- a/include/mruby/hash.h +++ b/include/mruby/hash.h @@ -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) diff --git a/include/mruby/proc.h b/include/mruby/proc.h index 8c6146860..2073494e1 100644 --- a/include/mruby/proc.h +++ b/include/mruby/proc.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); diff --git a/include/mruby/range.h b/include/mruby/range.h index a87f1cc6a..9ec492ada 100644 --- a/include/mruby/range.h +++ b/include/mruby/range.h @@ -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); diff --git a/include/mruby/string.h b/include/mruby/string.h index 000c80b09..f789771db 100644 --- a/include/mruby/string.h +++ b/include/mruby/string.h @@ -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) diff --git a/include/mruby/value.h b/include/mruby/value.h index e78035b5f..f7166091a 100644 --- a/include/mruby/value.h +++ b/include/mruby/value.h @@ -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 diff --git a/mrbgems/mruby-fiber/src/fiber.c b/mrbgems/mruby-fiber/src/fiber.c index bd9abe125..4c844ec9c 100644 --- a/mrbgems/mruby-fiber/src/fiber.c +++ b/mrbgems/mruby-fiber/src/fiber.c @@ -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"); diff --git a/src/class.c b/src/class.c index 6d77f24e6..4331becae 100644 --- a/src/class.c +++ b/src/class.c @@ -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)); } } diff --git a/src/object.c b/src/object.c index 5b2278767..5da5f651a 100644 --- a/src/object.c +++ b/src/object.c @@ -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) |
