From e04c75dd68a6c8d0c5fc82610c24d65819b654cc Mon Sep 17 00:00:00 2001 From: matz Date: Wed, 8 Jun 2005 03:30:56 +0000 Subject: * array.c (rb_ary_nitems): add the block feature to Array#nitems. suggested by Bertram Scharpf in [ruby-talk:134083]. git-svn-id: http://svn.ruby-lang.org/repos/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 ccd39a24d..1cbd1eca8 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 ceb68f503..79547bee3 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 dc5e11744..d15e42f08 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 445321a49..2ca825bea 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 0beb8c09f..05c2d37f3 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(; ; ;), -- cgit