Skip to content

Commit 29dd466

Browse files
committed
fix WB related APIs.
1 parent 693d439 commit 29dd466

File tree

4 files changed

+50
-25
lines changed

4 files changed

+50
-25
lines changed

array.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -456,8 +456,9 @@ rb_ary_new4(long n, const VALUE *elts)
456456

457457
ary = rb_ary_new2(n);
458458
if (n > 0 && elts) {
459-
/* new array is not old gen */
460-
MEMCPY(RARRAY_RAWPTR(ary), elts, VALUE, n);
459+
RARRAY_PTR_USE(ary, ptr, {
460+
MEMCPY(ptr, elts, VALUE, n); /* new array is not old gen */
461+
});
461462
ARY_SET_LEN(ary, n);
462463
}
463464

@@ -651,7 +652,7 @@ rb_ary_initialize(int argc, VALUE *argv, VALUE ary)
651652

652653
rb_ary_modify(ary);
653654
if (argc == 0) {
654-
if (ARY_OWNS_HEAP_P(ary) && RARRAY_RAWPTR(ary)) {
655+
if (ARY_OWNS_HEAP_P(ary) && RARRAY_HAVE_PTR(ary)) {
655656
xfree(RARRAY_RAWPTR(ary));
656657
}
657658
rb_ary_unshare_safe(ary);
@@ -692,7 +693,11 @@ rb_ary_initialize(int argc, VALUE *argv, VALUE ary)
692693
}
693694
}
694695
else {
695-
memfill(RARRAY_RAWPTR(ary), len, val);
696+
if (0) memfill(RARRAY_RAWPTR(ary), len, val);
697+
698+
RARRAY_PTR_USE(ary, ptr, {
699+
memfill(ptr, len, val);
700+
});
696701
OBJ_WB(ary, val);
697702
ARY_SET_LEN(ary, len);
698703
}

error.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ rb_bug(const char *fmt, ...)
310310
_set_abort_behavior( 0, _CALL_REPORTFAULT);
311311
#endif
312312

313-
if (0) {
313+
if (1) {
314314
char buff[100];
315315
sprintf(buff, "gdb -p %d -x ../gitruby/.gdbinit", getpid());
316316
system(buff);

gc.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5178,7 +5178,7 @@ rgengc_profile_report(rb_objspace_t *objspace)
51785178
/* RGENGC: APIs */
51795179

51805180
void
5181-
rb_gc_wb(VALUE a, VALUE b)
5181+
rb_gc_writebarrier(VALUE a, VALUE b)
51825182
{
51835183
rb_objspace_t *objspace = &rb_objspace;
51845184

@@ -5203,7 +5203,7 @@ rb_gc_wb(VALUE a, VALUE b)
52035203
}
52045204
}
52055205

5206-
VALUE
5206+
void
52075207
rb_gc_giveup_writebarrier(VALUE obj)
52085208
{
52095209
rb_objspace_t *objspace = &rb_objspace;
@@ -5228,6 +5228,4 @@ rb_gc_giveup_writebarrier(VALUE obj)
52285228
rgengc_remember(objspace, obj);
52295229

52305230
objspace->rgengc.shade_operation_count++;
5231-
5232-
return obj;
52335231
}

include/ruby/ruby.h

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
909931
struct 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

11731197
static 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)) {
11771201
rb_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

Comments
 (0)