summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--array.c26
-rw-r--r--bignum.c16
-rw-r--r--test/ripper/test_parser_events.rb2
-rw-r--r--test/ripper/test_scanner_events.rb2
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 <matz@ruby-lang.org>
+
+ * array.c (rb_ary_nitems): add the block feature to Array#nitems.
+ suggested by Bertram Scharpf <lists@bertram-scharpf.de> in
+ [ruby-talk:134083].
+
Wed Jun 8 11:11:34 2005 Yukihiro Matsumoto <matz@ruby-lang.org>
* 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-<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);
}
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; 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(; ; ;),