From 8d5e6a0fc68dbea9b7182d8e8dd9ac4a5b65af57 Mon Sep 17 00:00:00 2001 From: matz Date: Wed, 8 Jun 2005 03:30:56 +0000 Subject: [PATCH] * array.c (rb_ary_nitems): add the block feature to Array#nitems. suggested by Bertram Scharpf in [ruby-talk:134083]. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8593 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ array.c | 26 ++++++++++++++++++++------ bignum.c | 16 ---------------- test/ripper/test_parser_events.rb | 2 +- test/ripper/test_scanner_events.rb | 2 +- 5 files changed, 28 insertions(+), 24 deletions(-) diff --git a/ChangeLog b/ChangeLog index ccd39a24d3..1cbd1eca8d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Wed Jun 8 12:25:59 2005 Yukihiro Matsumoto + + * array.c (rb_ary_nitems): add the block feature to Array#nitems. + suggested by Bertram Scharpf in + [ruby-talk:134083]. + Wed Jun 8 11:11:34 2005 Yukihiro Matsumoto * bignum.c (get2comp): revert all prior changes, and calculate diff --git a/array.c b/array.c index ceb68f5034..79547bee37 100644 --- a/array.c +++ b/array.c @@ -2890,11 +2890,16 @@ rb_ary_compact(ary) /* * call-seq: * array.nitems -> int + * array.nitems { |item| block } -> int * * Returns the number of non-nil elements in _self_. + * If a block is given, the elements yielding a true value are + * counted. + * * May be zero. * * [ 1, nil, 3, nil, 5 ].nitems #=> 3 + * [5,6,7,8,9].nitems { |x| x % 2 != 0 } #=> 3 */ static VALUE @@ -2902,14 +2907,23 @@ rb_ary_nitems(ary) VALUE ary; { long n = 0; - VALUE *p, *pend; + + if (rb_block_given_p()) { + long i; - p = RARRAY(ary)->ptr; - pend = p + RARRAY(ary)->len; + for (i=0; ilen; i++) { + VALUE v = RARRAY(ary)->ptr[i]; + if (RTEST(rb_yield(v))) n++; + } + } + else { + VALUE *p = RARRAY(ary)->ptr; + VALUE *pend = p + RARRAY(ary)->len; - while (p < pend) { - if (!NIL_P(*p)) n++; - p++; + while (p < pend) { + if (!NIL_P(*p)) n++; + p++; + } } return LONG2NUM(n); } diff --git a/bignum.c b/bignum.c index dc5e117445..d15e42f083 100644 --- a/bignum.c +++ b/bignum.c @@ -1065,22 +1065,6 @@ rb_big_neg(x) } RBIGNUM(z)->sign = !RBIGNUM(z)->sign; if (RBIGNUM(x)->sign) get2comp(z, Qtrue); -#if 0 - i = RBIGNUM(x)->len; - if (RBIGNUM(x)->sign) { - while (i--) { - if (ds[i]) nz = Qtrue; - } - if (!nz) { - z = bignew(RBIGNUM(x)->len+1, 1); - for (i=0; ilen; i++) { - BDIGITS(z)[i] = BDIGITS(x)[i]; - } - BDIGITS(z)[i] = 1; - BDIGITS(z)[0] = 0; - } - } -#endif return bignorm(z); } diff --git a/test/ripper/test_parser_events.rb b/test/ripper/test_parser_events.rb index 445321a497..2ca825bea1 100644 --- a/test/ripper/test_parser_events.rb +++ b/test/ripper/test_parser_events.rb @@ -30,7 +30,7 @@ class TestRipper_ParserEvents < Test::Unit::TestCase def test_void_stmt assert_equal '[void()]', parse('') - assert_equal '[void()]', parse(';;') + assert_equal '[void()]', parse('; ;') end def test_var_ref diff --git a/test/ripper/test_scanner_events.rb b/test/ripper/test_scanner_events.rb index 0beb8c09f9..05c2d37f3e 100644 --- a/test/ripper/test_scanner_events.rb +++ b/test/ripper/test_scanner_events.rb @@ -640,7 +640,7 @@ class TestRipper_ScannerEvents < Test::Unit::TestCase assert_equal %w(;), scan('semicolon', ';') assert_equal %w(; ;), - scan('semicolon', ';;') + scan('semicolon', '; ;') assert_equal %w(; ; ;), scan('semicolon', 'nil;nil;nil;') assert_equal %w(; ; ;),