diff options
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | array.c | 20 |
2 files changed, 23 insertions, 8 deletions
@@ -1,3 +1,14 @@ +Mon Jul 22 12:58:18 2013 Koichi Sasada <ko1@atdot.net> + + * 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 <ko1@atdot.net> * gc.c (gc_slot_sweep): need to add empty RVALUE as freeobj. @@ -102,6 +102,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) { #if 1 @@ -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; } |