* array.c: reduce shady operations.
* array.c (rb_ary_modify, ary_make_partial, rb_ary_splice, rb_ary_replace, rb_ary_eql, rb_ary_compact_bang): use RARRAY_RAWPTR() instead of RARRAY_PTR(). * array.c (rb_ary_shift): use RARRAY_PTR_USE() without WB because there are not new relations. * array.c (ary_ensure_room_for_unshift): ditto. * array.c (rb_ary_sort_bang): ditto. * array.c (rb_ary_delete_at): ditto. * array.c (rb_ary_reverse_m): use RARRAY_RAWPTR() because there are not new relations. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42072 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
8d8ead142c
commit
6e3c4fd8b5
20
ChangeLog
20
ChangeLog
@ -1,3 +1,23 @@
|
||||
Fri Jul 19 21:35:09 2013 Koichi Sasada <ko1@atdot.net>
|
||||
|
||||
* array.c: reduce shady operations.
|
||||
|
||||
* array.c (rb_ary_modify, ary_make_partial, rb_ary_splice,
|
||||
rb_ary_replace, rb_ary_eql, rb_ary_compact_bang):
|
||||
use RARRAY_RAWPTR() instead of RARRAY_PTR().
|
||||
|
||||
* array.c (rb_ary_shift): use RARRAY_PTR_USE() without WB because
|
||||
there are not new relations.
|
||||
|
||||
* array.c (ary_ensure_room_for_unshift): ditto.
|
||||
|
||||
* array.c (rb_ary_sort_bang): ditto.
|
||||
|
||||
* array.c (rb_ary_delete_at): ditto.
|
||||
|
||||
* array.c (rb_ary_reverse_m): use RARRAY_RAWPTR() because
|
||||
there are not new relations.
|
||||
|
||||
Fri Jul 19 20:58:20 2013 Koichi Sasada <ko1@atdot.net>
|
||||
|
||||
* array.c: reduce shade operations.
|
||||
|
50
array.c
50
array.c
@ -361,9 +361,9 @@ rb_ary_modify(VALUE ary)
|
||||
ARY_SET_EMBED_LEN(ary, len);
|
||||
}
|
||||
else if (ARY_SHARED_NUM(shared) == 1 && len > (RARRAY_LEN(shared)>>1)) {
|
||||
long shift = RARRAY_PTR(ary) - RARRAY_PTR(shared);
|
||||
long shift = RARRAY_RAWPTR(ary) - RARRAY_RAWPTR(shared);
|
||||
FL_UNSET_SHARED(ary);
|
||||
ARY_SET_PTR(ary, RARRAY_PTR(shared));
|
||||
ARY_SET_PTR(ary, RARRAY_RAWPTR(shared));
|
||||
ARY_SET_CAPA(ary, RARRAY_LEN(shared));
|
||||
MEMMOVE(RARRAY_PTR(ary), RARRAY_PTR(ary)+shift, VALUE, len);
|
||||
FL_SET_EMBED(shared);
|
||||
@ -865,7 +865,7 @@ ary_make_partial(VALUE ary, VALUE klass, long offset, long len)
|
||||
FL_UNSET_EMBED(result);
|
||||
|
||||
shared = ary_make_shared(ary);
|
||||
ARY_SET_PTR(result, RARRAY_PTR(ary));
|
||||
ARY_SET_PTR(result, RARRAY_RAWPTR(ary));
|
||||
ARY_SET_LEN(result, RARRAY_LEN(ary));
|
||||
rb_ary_set_shared(result, shared);
|
||||
|
||||
@ -1038,7 +1038,9 @@ rb_ary_shift(VALUE ary)
|
||||
top = RARRAY_AREF(ary, 0);
|
||||
if (!ARY_SHARED_P(ary)) {
|
||||
if (RARRAY_LEN(ary) < ARY_DEFAULT_SIZE) {
|
||||
MEMMOVE(RARRAY_PTR(ary), RARRAY_PTR(ary)+1, VALUE, RARRAY_LEN(ary)-1);
|
||||
RARRAY_PTR_USE(ary, ptr, {
|
||||
MEMMOVE(ptr, ptr+1, VALUE, RARRAY_LEN(ary)-1);
|
||||
}); /* WB: no new reference */
|
||||
ARY_INCREASE_LEN(ary, -1);
|
||||
return top;
|
||||
}
|
||||
@ -1151,7 +1153,9 @@ ary_ensure_room_for_unshift(VALUE ary, int argc)
|
||||
}
|
||||
else {
|
||||
/* sliding items */
|
||||
MEMMOVE(RARRAY_PTR(ary) + argc, RARRAY_PTR(ary), VALUE, len);
|
||||
RARRAY_PTR_USE(ary, ptr, {
|
||||
MEMMOVE(ptr + argc, ptr, VALUE, len);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@ -1566,7 +1570,7 @@ rb_ary_splice(VALUE ary, long beg, long len, VALUE rpl)
|
||||
len = beg + rlen;
|
||||
ary_mem_clear(ary, RARRAY_LEN(ary), beg - RARRAY_LEN(ary));
|
||||
if (rlen > 0) {
|
||||
ary_memcpy(ary, beg, rlen, RARRAY_PTR(rpl));
|
||||
ary_memcpy(ary, beg, rlen, RARRAY_RAWPTR(rpl));
|
||||
}
|
||||
ARY_SET_LEN(ary, len);
|
||||
}
|
||||
@ -1585,7 +1589,7 @@ rb_ary_splice(VALUE ary, long beg, long len, VALUE rpl)
|
||||
ARY_SET_LEN(ary, alen);
|
||||
}
|
||||
if (rlen > 0) {
|
||||
MEMMOVE(RARRAY_PTR(ary) + beg, RARRAY_PTR(rpl), VALUE, rlen);
|
||||
MEMMOVE(RARRAY_PTR(ary) + beg, RARRAY_RAWPTR(rpl), VALUE, rlen);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2189,8 +2193,8 @@ rb_ary_reverse_m(VALUE ary)
|
||||
VALUE dup = rb_ary_new2(len);
|
||||
|
||||
if (len > 0) {
|
||||
VALUE *p1 = RARRAY_PTR(ary);
|
||||
VALUE *p2 = RARRAY_PTR(dup) + len - 1;
|
||||
const VALUE *p1 = RARRAY_RAWPTR(ary);
|
||||
VALUE *p2 = (VALUE *)RARRAY_RAWPTR(dup) + len - 1;
|
||||
do *p2-- = *p1++; while (--len > 0);
|
||||
}
|
||||
ARY_SET_LEN(dup, RARRAY_LEN(ary));
|
||||
@ -2402,9 +2406,10 @@ rb_ary_sort_bang(VALUE ary)
|
||||
data.ary = tmp;
|
||||
data.opt_methods = 0;
|
||||
data.opt_inited = 0;
|
||||
ruby_qsort(RARRAY_PTR(tmp), len, sizeof(VALUE),
|
||||
rb_block_given_p()?sort_1:sort_2, &data);
|
||||
|
||||
RARRAY_PTR_USE(tmp, ptr, {
|
||||
ruby_qsort(ptr, len, sizeof(VALUE),
|
||||
rb_block_given_p()?sort_1:sort_2, &data);
|
||||
}); /* WB: no new reference */
|
||||
rb_ary_modify(ary);
|
||||
if (ARY_EMBED_P(tmp)) {
|
||||
if (ARY_SHARED_P(ary)) { /* ary might be destructively operated in the given block */
|
||||
@ -2431,7 +2436,7 @@ rb_ary_sort_bang(VALUE ary)
|
||||
else {
|
||||
xfree((void *)ARY_HEAP_PTR(ary));
|
||||
}
|
||||
ARY_SET_PTR(ary, RARRAY_PTR(tmp));
|
||||
ARY_SET_PTR(ary, RARRAY_RAWPTR(tmp));
|
||||
ARY_SET_HEAP_LEN(ary, len);
|
||||
ARY_SET_CAPA(ary, RARRAY_LEN(tmp));
|
||||
}
|
||||
@ -2923,8 +2928,9 @@ rb_ary_delete_at(VALUE ary, long pos)
|
||||
|
||||
rb_ary_modify(ary);
|
||||
del = RARRAY_AREF(ary, pos);
|
||||
MEMMOVE(RARRAY_PTR(ary)+pos, RARRAY_PTR(ary)+pos+1, VALUE,
|
||||
RARRAY_LEN(ary)-pos-1);
|
||||
RARRAY_PTR_USE(ary, ptr, {
|
||||
MEMMOVE(ptr+pos, ptr+pos+1, VALUE, RARRAY_LEN(ary)-pos-1);
|
||||
});
|
||||
ARY_INCREASE_LEN(ary, -1);
|
||||
|
||||
return del;
|
||||
@ -3276,8 +3282,8 @@ rb_ary_replace(VALUE copy, VALUE orig)
|
||||
VALUE shared = 0;
|
||||
|
||||
if (ARY_OWNS_HEAP_P(copy)) {
|
||||
xfree(RARRAY_PTR(copy));
|
||||
}
|
||||
RARRAY_PTR_USE(copy, ptr, xfree(ptr));
|
||||
}
|
||||
else if (ARY_SHARED_P(copy)) {
|
||||
shared = ARY_SHARED(copy);
|
||||
FL_UNSET_SHARED(copy);
|
||||
@ -3292,13 +3298,13 @@ rb_ary_replace(VALUE copy, VALUE orig)
|
||||
else {
|
||||
VALUE shared = ary_make_shared(orig);
|
||||
if (ARY_OWNS_HEAP_P(copy)) {
|
||||
xfree(RARRAY_PTR(copy));
|
||||
RARRAY_PTR_USE(copy, ptr, xfree(ptr));
|
||||
}
|
||||
else {
|
||||
rb_ary_unshare_safe(copy);
|
||||
}
|
||||
FL_UNSET_EMBED(copy);
|
||||
ARY_SET_PTR(copy, RARRAY_PTR(orig));
|
||||
ARY_SET_PTR(copy, RARRAY_RAWPTR(orig));
|
||||
ARY_SET_LEN(copy, RARRAY_LEN(orig));
|
||||
rb_ary_set_shared(copy, shared);
|
||||
}
|
||||
@ -3711,7 +3717,7 @@ rb_ary_eql(VALUE ary1, VALUE ary2)
|
||||
if (ary1 == ary2) return Qtrue;
|
||||
if (!RB_TYPE_P(ary2, T_ARRAY)) return Qfalse;
|
||||
if (RARRAY_LEN(ary1) != RARRAY_LEN(ary2)) return Qfalse;
|
||||
if (RARRAY_PTR(ary1) == RARRAY_PTR(ary2)) return Qtrue;
|
||||
if (RARRAY_RAWPTR(ary1) == RARRAY_RAWPTR(ary2)) return Qtrue;
|
||||
return rb_exec_recursive_paired(recursive_eql, ary1, ary2, ary2);
|
||||
}
|
||||
|
||||
@ -4155,14 +4161,14 @@ rb_ary_compact_bang(VALUE ary)
|
||||
long n;
|
||||
|
||||
rb_ary_modify(ary);
|
||||
p = t = RARRAY_PTR(ary);
|
||||
p = t = (VALUE *)RARRAY_RAWPTR(ary); /* WB: no new reference */
|
||||
end = p + RARRAY_LEN(ary);
|
||||
|
||||
while (t < end) {
|
||||
if (NIL_P(*t)) t++;
|
||||
else *p++ = *t++;
|
||||
}
|
||||
n = p - RARRAY_PTR(ary);
|
||||
n = p - RARRAY_RAWPTR(ary);
|
||||
if (RARRAY_LEN(ary) == n) {
|
||||
return Qnil;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user