diff --git a/ChangeLog b/ChangeLog index 47e9e2b556..4f9c8e0759 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +Mon Jul 22 12:58:18 2013 Koichi Sasada + + * array.c (ary_memfill): added. + + * array.c (rb_ary_initialize): use ary_memfill(). + + * array.c (rb_ary_fill): ditto. + + * array.c (rb_ary_slice_bang): use RARRAY_RAWPTR() because + this code creates no new references. + Mon Jul 22 10:09:46 2013 Koichi Sasada * gc.c (gc_slot_sweep): need to add empty RVALUE as freeobj. diff --git a/array.c b/array.c index eeeb989a2b..c05ee1a23d 100644 --- a/array.c +++ b/array.c @@ -101,6 +101,15 @@ memfill(register VALUE *mem, register long size, register VALUE val) } } +static void +ary_memfill(VALUE ary, long beg, long size, VALUE val) +{ + RARRAY_PTR_USE(ary, ptr, { + memfill(ptr + beg, size, val); + OBJ_WRITTEN(ary, Qundef, val); + }); +} + static void ary_memcpy(VALUE ary, long beg, long argc, const VALUE *argv) { @@ -787,10 +796,7 @@ rb_ary_initialize(int argc, VALUE *argv, VALUE ary) } } else { - RARRAY_PTR_USE(ary, ptr, { - memfill((VALUE *)ptr, len, val); - }); - OBJ_WRITTEN(ary, Qundef, val); + ary_memfill(ary, 0, len, val); ARY_SET_LEN(ary, len); } return ary; @@ -2999,7 +3005,7 @@ rb_ary_slice_bang(int argc, VALUE *argv, VALUE ary) len = orig_len - pos; } if (len == 0) return rb_ary_new2(0); - arg2 = rb_ary_new4(len, RARRAY_PTR(ary)+pos); + arg2 = rb_ary_new4(len, RARRAY_RAWPTR(ary)+pos); RBASIC_SET_CLASS(arg2, rb_obj_class(ary)); rb_ary_splice(ary, pos, len, Qundef); return arg2; @@ -3372,7 +3378,6 @@ rb_ary_fill(int argc, VALUE *argv, VALUE ary) { VALUE item, arg1, arg2; long beg = 0, end = 0, len = 0; - VALUE *p; int block_p = FALSE; if (rb_block_given_p()) { @@ -3429,8 +3434,7 @@ rb_ary_fill(int argc, VALUE *argv, VALUE ary) } } else { - p = RARRAY_PTR(ary) + beg; - memfill(p, len, item); + ary_memfill(ary, beg, len, item); } return ary; }