ruby-changes:37115
From: nobu <ko1@a...>
Date: Sat, 10 Jan 2015 10:12:32 +0900 (JST)
Subject: [ruby-changes:37115] nobu:r49196 (trunk): array.c: keep consistency
nobu 2015-01-10 10:12:17 +0900 (Sat, 10 Jan 2015) New Revision: 49196 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=49196 Log: array.c: keep consistency * array.c (rb_ary_select_bang): keep the array consistent by removing unselected values soon. [ruby-dev:48805] [Bug #10722] Modified files: trunk/ChangeLog trunk/array.c trunk/test/ruby/test_array.rb Index: array.c =================================================================== --- array.c (revision 49195) +++ array.c (revision 49196) @@ -2843,23 +2843,22 @@ rb_ary_select(VALUE ary) https://github.com/ruby/ruby/blob/trunk/array.c#L2843 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; } /* Index: ChangeLog =================================================================== --- ChangeLog (revision 49195) +++ ChangeLog (revision 49196) @@ -1,3 +1,8 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 +Sat Jan 10 10:12:15 2015 Nobuyoshi Nakada <nobu@r...> + + * array.c (rb_ary_select_bang): keep the array consistent by + removing unselected values soon. [ruby-dev:48805] [Bug #10722] + Fri Jan 9 23:20:04 2015 SHIBATA Hiroshi <shibata.hiroshi@g...> * lib/rubygems: Update to RubyGems HEAD(e53c54a). Index: test/ruby/test_array.rb =================================================================== --- test/ruby/test_array.rb (revision 49195) +++ test/ruby/test_array.rb (revision 49196) @@ -2019,6 +2019,16 @@ class TestArray < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_array.rb#L2019 a = @cls[ 1, 2, 3, 4, 5 ] assert_equal(a, a.select! { |i| i > 3 }) assert_equal(@cls[4, 5], a) + + bug10722 = '[ruby-dev:48805] [Bug #10722]' + a = @cls[ 5, 6, 7, 8, 9, 10 ] + r = a.select! {|i| + break i if i > 8 + # assert_equal(a[0], i, "should be selected values only") if i == 7 + i >= 7 + } + assert_equal(9, r) + assert_equal(@cls[7, 8, 9, 10], a, bug10722) end def test_delete2 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/