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

ruby-changes:20325

From: nobu <ko1@a...>
Date: Sun, 3 Jul 2011 13:45:02 +0900 (JST)
Subject: [ruby-changes:20325] nobu:r32373 (trunk, ruby_1_8): * array.c (ary_reject_bang): should not remove elements which are

nobu	2011-07-03 13:44:53 +0900 (Sun, 03 Jul 2011)

  New Revision: 32373

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=32373

  Log:
    * array.c (ary_reject_bang): should not remove elements which are
      not yielded.  [Bug #2545]

  Modified files:
    branches/ruby_1_8/ChangeLog
    branches/ruby_1_8/array.c
    branches/ruby_1_8/test/ruby/test_array.rb
    trunk/ChangeLog
    trunk/array.c
    trunk/test/ruby/test_array.rb

Index: array.c
===================================================================
--- array.c	(revision 32372)
+++ array.c	(revision 32373)
@@ -2567,42 +2567,34 @@
 ary_reject(VALUE orig, VALUE result)
 {
     long i;
-    int rejected = 0;
 
     for (i = 0; i < RARRAY_LEN(orig); i++) {
 	VALUE v = RARRAY_PTR(orig)[i];
 	if (!RTEST(rb_yield(v))) {
 	    rb_ary_push_1(result, v);
 	}
-	else {
-	    rejected = 1;
-	}
     }
-    return rejected ? result : 0;
+    return result;
 }
 
 static VALUE
-ary_protecting_reject(VALUE arg)
-{
-    VALUE *args = (VALUE *)arg;
-    return ary_reject(args[0], args[1]);
-}
-
-static VALUE
 ary_reject_bang(VALUE ary)
 {
-    VALUE args[2];
-    int state = 0;
+    long i;
+    VALUE result = Qnil;
 
     rb_ary_modify_check(ary);
-    args[0] = ary;
-    args[1] = rb_ary_new();
-    if (!rb_protect(ary_protecting_reject, (VALUE)args, &state)) {
-	return Qnil;
+    for (i = 0; i < RARRAY_LEN(ary); ) {
+	VALUE v = RARRAY_PTR(ary)[i];
+	if (RTEST(rb_yield(v))) {
+	    rb_ary_delete_at(ary, i);
+	    result = ary;
+	}
+	else {
+	    i++;
+	}
     }
-    rb_ary_replace(ary, args[1]);
-    if (state) rb_jump_tag(state);
-    return ary;
+    return result;
 }
 
 /*
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 32372)
+++ ChangeLog	(revision 32373)
@@ -1,3 +1,8 @@
+Sun Jul  3 13:44:51 2011  Nobuyoshi Nakada  <nobu@r...>
+
+	* array.c (ary_reject_bang): should not remove elements which are
+	  not yielded.  [Bug #2545]
+
 Sun Jul  3 06:10:26 2011  KOSAKI Motohiro  <kosaki.motohiro@g...>
 
 	* thread_pthread.c (get_stack): pthread_attr_getstack() doesn't
Index: test/ruby/test_array.rb
===================================================================
--- test/ruby/test_array.rb	(revision 32372)
+++ test/ruby/test_array.rb	(revision 32373)
@@ -611,7 +611,7 @@
     bug2545 = '[ruby-core:27366]'
     a = @cls[ 5, 6, 7, 8, 9, 10 ]
     assert_equal(9, a.delete_if {|i| break i if i > 8; i < 7})
-    assert_equal(@cls[7, 8], a, bug2545)
+    assert_equal(@cls[7, 8, 9, 10], a, bug2545)
   end
 
   def test_dup
@@ -1096,7 +1096,7 @@
     bug2545 = '[ruby-core:27366]'
     a = @cls[ 5, 6, 7, 8, 9, 10 ]
     assert_equal(9, a.reject! {|i| break i if i > 8; i < 7})
-    assert_equal(@cls[7, 8], a, bug2545)
+    assert_equal(@cls[7, 8, 9, 10], a, bug2545)
   end
 
   def test_replace
Index: ruby_1_8/array.c
===================================================================
--- ruby_1_8/array.c	(revision 32372)
+++ ruby_1_8/array.c	(revision 32373)
@@ -2205,44 +2205,35 @@
     VALUE orig, result;
 {
     long i;
-    int rejected = 0;
 
     for (i = 0; i < RARRAY_LEN(orig); i++) {
 	VALUE v = RARRAY_PTR(orig)[i];
 	if (!RTEST(rb_yield(v))) {
 	    rb_ary_push(result, v);
 	}
-	else {
-	    rejected = 1;
-	}
     }
-    return rejected ? result : 0;
+    return result;
 }
 
 static VALUE
-ary_protecting_reject(arg)
-    VALUE arg;
-{
-    VALUE *args = (VALUE *)arg;
-    return ary_reject(args[0], args[1]);
-}
-
-static VALUE
 ary_reject_bang(ary)
     VALUE ary;
 {
-    VALUE args[2];
-    int state = 0;
+    long i;
+    VALUE result = Qnil;
 
     rb_ary_modify_check(ary);
-    args[0] = ary;
-    args[1] = rb_ary_new();
-    if (!rb_protect(ary_protecting_reject, (VALUE)args, &state)) {
-	return Qnil;
+    for (i = 0; i < RARRAY_LEN(ary); ) {
+	VALUE v = RARRAY_PTR(ary)[i];
+	if (RTEST(rb_yield(v))) {
+	    rb_ary_delete_at(ary, i);
+	    result = ary;
+	}
+	else {
+	    i++;
+	}
     }
-    rb_ary_replace(ary, args[1]);
-    if (state) rb_jump_tag(state);
-    return ary;
+    return result;
 }
 
 /*
Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog	(revision 32372)
+++ ruby_1_8/ChangeLog	(revision 32373)
@@ -1,3 +1,8 @@
+Sun Jul  3 13:44:51 2011  Nobuyoshi Nakada  <nobu@r...>
+
+	* array.c (ary_reject_bang): should not remove elements which are
+	  not yielded.  [Bug #2545]
+
 Sat Jul  2 07:17:45 2011  Nobuyoshi Nakada  <nobu@r...>
 
 	* array.c (rb_ary_reject_bang, rb_ary_delete_if): rejected
Index: ruby_1_8/test/ruby/test_array.rb
===================================================================
--- ruby_1_8/test/ruby/test_array.rb	(revision 32372)
+++ ruby_1_8/test/ruby/test_array.rb	(revision 32373)
@@ -601,7 +601,7 @@
     bug2545 = '[ruby-core:27366]'
     a = @cls[ 5, 6, 7, 8, 9, 10 ]
     assert_equal(9, a.delete_if {|i| break i if i > 8; i < 7})
-    assert_equal(@cls[7, 8], a, bug2545)
+    assert_equal(@cls[7, 8, 9, 10], a, bug2545)
   end
 
   def test_dup
@@ -976,7 +976,7 @@
     bug2545 = '[ruby-core:27366]'
     a = @cls[ 5, 6, 7, 8, 9, 10 ]
     assert_equal(9, a.reject! {|i| break i if i > 8; i < 7})
-    assert_equal(@cls[7, 8], a, bug2545)
+    assert_equal(@cls[7, 8, 9, 10], a, bug2545)
   end
 
   def test_replace

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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