[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]