@@ -694,11 +694,11 @@ struct RBasicRaw {
694694 VALUE klass ;
695695};
696696
697- #define RBASIC_CLEAR_CLASS (obj ) (((struct RBasicRaw *)(obj))->klass = 0)
698- #define RBASIC_SET_CLASS_RAW (obj , cls ) (((struct RBasicRaw *)(obj))->klass = (cls))
697+ #define RBASIC_CLEAR_CLASS (obj ) (((struct RBasicRaw *)((VALUE)( obj) ))->klass = 0)
698+ #define RBASIC_SET_CLASS_RAW (obj , cls ) (((struct RBasicRaw *)((VALUE)( obj) ))->klass = (cls))
699699#define RBASIC_SET_CLASS (obj , cls ) do { \
700- VALUE _obj_ = (obj); \
701- VALUE _cls_ = (cls); \
700+ VALUE _obj_ = (VALUE)( obj); \
701+ VALUE _cls_ = (VALUE)( cls); \
702702 OBJ_WB(_obj_, _cls_); RBASIC_SET_CLASS_RAW(_obj_, _cls_); \
703703} while (0)
704704
@@ -901,11 +901,33 @@ struct RArray {
901901
902902#define RARRAY_LENINT (ary ) rb_long2int(RARRAY_LEN(ary))
903903
904+ /* DO NOT USE THIS MACRO DIRECTLY */
904905#define RARRAY_RAWPTR (a ) \
905906 ((RBASIC(a)->flags & RARRAY_EMBED_FLAG) ? \
906907 RARRAY(a)->as.ary : \
907908 RARRAY(a)->as.heap.ptr)
908909
910+ #define RARRAY_HAVE_PTR (a ) (RARRAY_RAWPTR(a) == 0 ? 0 : 1)
911+
912+ #define RARRAY_PTR_USE_START (a ) RARRAY_RAWPTR(a)
913+ #define RARRAY_PTR_USE_END (a ) /* */
914+
915+ #define RARRAY_PTR_USE (ary , ptr_name , expr ) do { \
916+ const VALUE _ary = (ary); \
917+ VALUE *ptr_name = RARRAY_PTR_USE_START(_ary); \
918+ expr; \
919+ RARRAY_PTR_USE_END(_ary); \
920+ } while (0)
921+
922+ #define RARRAY_AREF (a , i ) (RARRAY_RAWPTR(a)[i])
923+ #define RARRAY_ASET (a , i , v ) do { \
924+ const VALUE _ary = (a); \
925+ const VALUE _val = (v); \
926+ RARRAY_RAWPTR(OBJ_WB(_ary, _val))[i] = _val; \
927+ } while (0)
928+
929+ #define RARRAY_PTR (a ) RARRAY_RAWPTR(OBJ_WB_GIVEUP((VALUE)a))
930+
909931struct RRegexp {
910932 struct RBasic basic ;
911933 struct re_pattern_buffer * ptr ;
@@ -1165,31 +1187,31 @@ struct RBignum {
11651187
11661188#define OBJ_PROMOTED (x ) (SPECIAL_CONST_P(x) ? 0 : FL_TEST_RAW((x), FL_OLDGEN))
11671189#define OBJ_WB_PROTECTED (x ) (SPECIAL_CONST_P(x) ? 1 : FL_TEST_RAW((x), FL_KEEP_WB))
1190+ #define OBJ_WB_GIVEUP (x ) rb_obj_wb_giveup(x)
11681191#define OBJ_SHADE (x ) OBJ_WB_GIVEUP(x) /* RGENGC terminology */
1192+ #define OBJ_WB (a , b ) rb_obj_wb((a), (b))
11691193
1170- void rb_gc_wb (VALUE a , VALUE b );
1171- VALUE rb_gc_giveup_writebarrier (VALUE obj );
1194+ void rb_gc_writebarrier (VALUE a , VALUE b );
1195+ void rb_gc_giveup_writebarrier (VALUE obj );
11721196
11731197static inline VALUE
1174- OBJ_WB_GIVEUP (VALUE x )
1198+ rb_obj_wb_giveup (VALUE x )
11751199{
11761200 if (OBJ_WB_PROTECTED (x ) && OBJ_PROMOTED (x )) {
11771201rb_gc_giveup_writebarrier (x );
11781202 }
11791203 return x ;
11801204}
11811205
1182- #define OBJ_WB ( a , b ) (!SPECIAL_CONST_P(b) && OBJ_PROMOTED(a) && !OBJ_PROMOTED(b) && (rb_gc_wb((a), (b)), 1))
1183-
1184- #define RARRAY_AREF ( a , i ) (RARRAY_RAWPTR(a)[i])
1185- static inline void
1186- RARRAY_ASET ( VALUE a , long index , VALUE v ) {
1187- OBJ_WB ( a , v );
1188- RARRAY_RAWPTR ( a )[ index ] = v ;
1206+ static inline VALUE
1207+ rb_obj_wb ( VALUE a , VALUE b )
1208+ {
1209+ if (! SPECIAL_CONST_P ( b ) && ! OBJ_PROMOTED ( b ) && OBJ_PROMOTED ( a )) {
1210+ rb_gc_writebarrier ( a , b );
1211+ }
1212+ return a ;
11891213}
11901214
1191- #define RARRAY_PTR (a ) RARRAY_RAWPTR(OBJ_WB_GIVEUP((VALUE)a))
1192-
11931215#if SIZEOF_INT < SIZEOF_LONG
11941216# define INT2NUM (v ) INT2FIX((int)(v))
11951217# define UINT2NUM (v ) LONG2FIX((unsigned int)(v))
0 commit comments