diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-06-08 03:30:56 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-06-08 03:30:56 +0000 |
commit | 8d5e6a0fc68dbea9b7182d8e8dd9ac4a5b65af57 (patch) | |
tree | f4ca463a03a8ac0b5705df03ecf5a17e27de6f14 | |
parent | 5ef43814a8d1cf3b3905c70555b09255f37cf1e3 (diff) |
* array.c (rb_ary_nitems): add the block feature to Array#nitems.
suggested by Bertram Scharpf <[email protected]> in
[ruby-talk:134083].
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8593 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | array.c | 26 | ||||
-rw-r--r-- | bignum.c | 16 | ||||
-rw-r--r-- | test/ripper/test_parser_events.rb | 2 | ||||
-rw-r--r-- | test/ripper/test_scanner_events.rb | 2 |
5 files changed, 28 insertions, 24 deletions
@@ -1,3 +1,9 @@ +Wed Jun 8 12:25:59 2005 Yukihiro Matsumoto <[email protected]> + + * array.c (rb_ary_nitems): add the block feature to Array#nitems. + suggested by Bertram Scharpf <[email protected]> in + [ruby-talk:134083]. + Wed Jun 8 11:11:34 2005 Yukihiro Matsumoto <[email protected]> * bignum.c (get2comp): revert all prior changes, and calculate @@ -2890,11 +2890,16 @@ rb_ary_compact(ary) /* * call-seq: * array.nitems -> int + * array.nitems { |item| block } -> int * * Returns the number of non-<code>nil</code> 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; i<RARRAY(ary)->len; 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); } @@ -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; i<RBIGNUM(x)->len; 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(; ; ;), |