From 6343e30c147dc00e34e9d45ea3f74f94873b9709 Mon Sep 17 00:00:00 2001 From: nobu Date: Sun, 3 Jul 2011 04:44:53 +0000 Subject: * array.c (ary_reject_bang): should not remove elements which are not yielded. [Bug #2545] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@32373 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ array.c | 34 +++++++++++++--------------------- test/ruby/test_array.rb | 4 ++-- 3 files changed, 20 insertions(+), 23 deletions(-) diff --git a/ChangeLog b/ChangeLog index fb61d81676..b78ae1e8bb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Sun Jul 3 13:44:51 2011 Nobuyoshi Nakada + + * array.c (ary_reject_bang): should not remove elements which are + not yielded. [Bug #2545] + Sun Jul 3 06:10:26 2011 KOSAKI Motohiro * thread_pthread.c (get_stack): pthread_attr_getstack() doesn't diff --git a/array.c b/array.c index 3a8d0e915c..7360a68e68 100644 --- a/array.c +++ b/array.c @@ -2567,42 +2567,34 @@ static VALUE 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; -} - -static VALUE -ary_protecting_reject(VALUE arg) -{ - VALUE *args = (VALUE *)arg; - return ary_reject(args[0], args[1]); + return result; } 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; } /* diff --git a/test/ruby/test_array.rb b/test/ruby/test_array.rb index a22412c70c..64524768e1 100644 --- a/test/ruby/test_array.rb +++ b/test/ruby/test_array.rb @@ -611,7 +611,7 @@ class TestArray < Test::Unit::TestCase 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 @@ class TestArray < Test::Unit::TestCase 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 -- cgit v1.2.3