From 8dc2fa3bc8233d51d546359fcba89afe56892f1f Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sat, 3 Aug 2013 14:03:44 -0700 Subject: 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 --- src/class.c | 2 +- src/etc.c | 2 +- src/object.c | 2 +- src/vm.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) (limited to 'src') 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); } } diff --git a/src/etc.c b/src/etc.c index 2aee0f0f7..368685cf1 100644 --- a/src/etc.c +++ b/src/etc.c @@ -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)); } } diff --git a/src/vm.c b/src/vm.c index 4d99ad413..7d01239be 100644 --- a/src/vm.c +++ b/src/vm.c @@ -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) -- cgit v1.2.3 From 8854ecb629726e24aef03183b36fe3b1314dfb91 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sun, 4 Aug 2013 00:40:41 -0700 Subject: revert one of the API changes: MRB_SET_VALUE_P no longer used --- include/mruby/value.h | 20 ++++++++++---------- src/class.c | 2 +- src/vm.c | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/include/mruby/value.h b/include/mruby/value.h index e98d3ce14..8971aca41 100644 --- a/include/mruby/value.h +++ b/include/mruby/value.h @@ -152,12 +152,14 @@ typedef struct mrb_value { #define MRB_SET_VALUE(o, tt, attr, v) do {\ (o).value.ttt = mrb_mktt(tt);\ - (o).attr = v;\ -} while (0) -#define MRB_SET_VALUE_P(o, tt, v) do {\ - (o).value.ttt = mrb_mktt(tt);\ - (o).value.i = 0;\ - (o).value.p = (void*)((uint64_t)(o).value.p | (((uint64_t)(v))>>2));\ + switch (tt) {\ + case MRB_TT_FALSE:\ + case MRB_TT_TRUE:\ + case MRB_TT_UNDEF:\ + case MRB_TT_FIXNUM:\ + case MRB_TT_SYMBOL: (o).attr = (v); break;\ + default: (o).value.i = 0; (o).value.p = (void*)((uint64_t)(o).value.p | (((uint64_t)(v))>>2)); break;\ + }\ } while (0) static inline mrb_value @@ -252,7 +254,6 @@ 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); @@ -279,7 +280,6 @@ typedef struct mrb_value { (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) @@ -426,7 +426,7 @@ mrb_obj_value(void *p) mrb_value v; struct RBasic *b = (struct RBasic*)p; - MRB_SET_VALUE_P(v, b->tt, p); + MRB_SET_VALUE(v, b->tt, value.p, p); return v; } @@ -439,7 +439,7 @@ mrb_voidp_value(struct mrb_state *mrb, void *p) { mrb_value v; - MRB_SET_VALUE_P(v, MRB_TT_VOIDP, p); + MRB_SET_VALUE(v, MRB_TT_VOIDP, value.p, p); return v; } #endif diff --git a/src/class.c b/src/class.c index 4331becae..6d77f24e6 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_P(m, MRB_TT_PROC, 0); + MRB_SET_VALUE(m, MRB_TT_PROC, value.p, 0); mrb_define_method_vm(mrb, c, a, m); } } diff --git a/src/vm.c b/src/vm.c index 7d01239be..4d99ad413 100644 --- a/src/vm.c +++ b/src/vm.c @@ -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_P(r, (((struct RObject*)(v))->tt), (v)) +#define SET_OBJ_VALUE(r,v) MRB_SET_VALUE(r, (((struct RObject*)(v))->tt), value.p, (v)) #ifdef MRB_NAN_BOXING #define SET_FLT_VALUE(mrb,r,v) r.f = (v) #elif defined(MRB_WORD_BOXING) -- cgit v1.2.3