diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-10-10 04:17:01 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-10-10 04:17:01 +0000 |
commit | 4ed087b0db4c11d743762615e2d3759b8c2aaf66 (patch) | |
tree | b88f05f86e454b1a4a167fe4cb3fdc498c4d6858 /enum.c | |
parent | 165b446166c65f4dd905569981d188cc3eee8a17 (diff) |
revisit `RARRAY_PTR()`.
* array.c (yield_indexed_values): use RARRAY_AREF/ASET instead of
using RARRAY_PTR().
* enum.c (nmin_filter): ditto.
* proc.c (rb_sym_to_proc): ditto.
* enum.c (rb_nmin_run): use RARRAY_PTR_USE() instead of RARRAY_PTR().
It is safe because they don't make new referecen from an array.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64986 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'enum.c')
-rw-r--r-- | enum.c | 24 |
1 files changed, 14 insertions, 10 deletions
@@ -1440,7 +1440,7 @@ nmin_filter(struct nmin_data *data) #undef GETPTR #undef SWAP - data->limit = RARRAY_PTR(data->buf)[store_index*eltsize]; /* the last pivot */ + data->limit = RARRAY_AREF(data->buf, store_index*eltsize); /* the last pivot */ data->curlen = data->n; rb_ary_resize(data->buf, data->n * eltsize); } @@ -1518,18 +1518,22 @@ rb_nmin_run(VALUE obj, VALUE num, int by, int rev, int ary) result = data.buf; if (by) { long i; - ruby_qsort(RARRAY_PTR(result), - RARRAY_LEN(result)/2, - sizeof(VALUE)*2, - data.cmpfunc, (void *)&data); - for (i=1; i<RARRAY_LEN(result); i+=2) { - RARRAY_PTR(result)[i/2] = RARRAY_PTR(result)[i]; - } + RARRAY_PTR_USE(result, ptr, { + ruby_qsort(ptr, + RARRAY_LEN(result)/2, + sizeof(VALUE)*2, + data.cmpfunc, (void *)&data); + for (i=1; i<RARRAY_LEN(result); i+=2) { + ptr[i/2] = ptr[i]; + } + }); rb_ary_resize(result, RARRAY_LEN(result)/2); } else { - ruby_qsort(RARRAY_PTR(result), RARRAY_LEN(result), sizeof(VALUE), - data.cmpfunc, (void *)&data); + RARRAY_PTR_USE(result, ptr, { + ruby_qsort(ptr, RARRAY_LEN(result), sizeof(VALUE), + data.cmpfunc, (void *)&data); + }); } if (rev) { rb_ary_reverse(result); |