diff --git a/ChangeLog b/ChangeLog index 3deb996f41..bdfd7c34c5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Fri Jul 19 19:07:31 2013 Koichi Sasada + + * array.c (ary_memcpy): add a function to copy VALUEs into ary + with write barrier. If ary is promoted, use write barrier correctly. + + * array.c (rb_ary_cat, rb_ary_unshift_m, rb_ary_dup, + rb_ary_sort_bang, rb_ary_replace, rb_ary_plus): use ary_memcpy(). + Fri Jul 19 15:32:57 2013 Koichi Sasada * array.c (rb_ary_store): use RARRAY_PTR_USE() intead of RARRAY_PTR(). diff --git a/array.c b/array.c index f3f1b2e960..4d025796c4 100644 --- a/array.c +++ b/array.c @@ -93,6 +93,38 @@ memfill(register VALUE *mem, register long size, register VALUE val) } } +static void +ary_memcpy(VALUE ary, long beg, long argc, const VALUE *argv) +{ +#if 1 + if (OBJ_PROMOTED(ary)) { + if (0 /* disalbe now, because it cause mysterious error. */ + && argc > 32 /* 32 is magic number */) { + rb_gc_writebarrier_remember_promoted(ary); + RARRAY_PTR_USE(ary, ptr, { + MEMCPY(ptr+beg, argv, VALUE, argc); + }); + } + else { + int i; + RARRAY_PTR_USE(ary, ptr, { + for (i=0; i