diff options
Diffstat (limited to 'array.c')
-rw-r--r-- | array.c | 27 |
1 files changed, 13 insertions, 14 deletions
@@ -1828,7 +1828,7 @@ rb_ary_collect_bang(ary) rb_ary_modify(ary); for (i = 0; i < RARRAY(ary)->len; i++) { - RARRAY(ary)->ptr[i] = rb_yield(RARRAY(ary)->ptr[i]); + rb_ary_store(ary, i, rb_yield(RARRAY(ary)->ptr[i])); } return ary; } @@ -2089,14 +2089,16 @@ rb_ary_reject_bang(ary) rb_ary_modify(ary); for (i1 = i2 = 0; i1 < RARRAY(ary)->len; i1++) { - if (RTEST(rb_yield(RARRAY(ary)->ptr[i1]))) continue; + VALUE v = RARRAY(ary)->ptr[i1]; + if (RTEST(rb_yield(v))) continue; if (i1 != i2) { - RARRAY(ary)->ptr[i2] = RARRAY(ary)->ptr[i1]; + rb_ary_store(ary, i2, v); } i2++; } if (RARRAY(ary)->len == i2) return Qnil; - RARRAY(ary)->len = i2; + if (i2 < RARRAY(ary)->len) + RARRAY(ary)->len = i2; return ary; } @@ -2603,7 +2605,7 @@ rb_ary_eql(ary1, ary2) if (TYPE(ary2) != T_ARRAY) return Qfalse; if (RARRAY(ary1)->len != RARRAY(ary2)->len) return Qfalse; for (i=0; i<RARRAY(ary1)->len; i++) { - if (!rb_eql(RARRAY(ary1)->ptr[i], RARRAY(ary2)->ptr[i])) + if (!rb_eql(rb_ary_elt(ary1, i), rb_ary_elt(ary2, i))) return Qfalse; } return Qtrue; @@ -2694,7 +2696,7 @@ rb_ary_cmp(ary1, ary2) len = RARRAY(ary2)->len; } for (i=0; i<len; i++) { - VALUE v = rb_funcall(RARRAY(ary1)->ptr[i], id_cmp, 1, RARRAY(ary2)->ptr[i]); + VALUE v = rb_funcall(rb_ary_elt(ary1, i), id_cmp, 1, rb_ary_elt(ary2, i)); if (v != INT2FIX(0)) { return v; } @@ -2842,7 +2844,7 @@ rb_ary_uniq_bang(ary) VALUE ary; { VALUE hash; - VALUE *p, *q, *end; + long i, j; rb_ary_modify(ary); @@ -2851,16 +2853,13 @@ rb_ary_uniq_bang(ary) if (RARRAY(ary)->len == RHASH(hash)->tbl->num_entries) { return Qnil; } - p = q = RARRAY(ary)->ptr; - end = p + RARRAY(ary)->len; - while (p < end) { - VALUE v = *p; + for (i=j=0; i<RARRAY(ary)->len; i++) { + VALUE v = rb_ary_elt(ary, i); if (st_delete(RHASH(hash)->tbl, (st_data_t*)&v, 0)) { - *q++ = *p; + rb_ary_store(ary, j++, v); } - p++; } - RARRAY(ary)->len = (q - RARRAY(ary)->ptr); + RARRAY(ary)->len = j; return ary; } |