diff options
Diffstat (limited to 'array.c')
-rw-r--r-- | array.c | 23 |
1 files changed, 11 insertions, 12 deletions
@@ -2843,23 +2843,22 @@ rb_ary_select(VALUE ary) static VALUE rb_ary_select_bang(VALUE ary) { - long i1, i2; + long i; + VALUE result = Qnil; RETURN_SIZED_ENUMERATOR(ary, 0, 0, ary_enum_length); rb_ary_modify(ary); - for (i1 = i2 = 0; i1 < RARRAY_LEN(ary); i1++) { - VALUE v = RARRAY_AREF(ary, i1); - if (!RTEST(rb_yield(v))) continue; - if (i1 != i2) { - rb_ary_store(ary, i2, v); + for (i = 0; i < RARRAY_LEN(ary); ) { + VALUE v = RARRAY_AREF(ary, i); + if (!RTEST(rb_yield(v))) { + rb_ary_delete_at(ary, i); + result = ary; + } + else { + i++; } - i2++; } - - if (i1 == i2) return Qnil; - if (i2 < i1) - ARY_SET_LEN(ary, i2); - return ary; + return result; } /* |