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/