array.c: check if numeric
* array.c (finish_exact_sum): add 0 and the initial value to check if the latter is numeric. [ruby-core:79572] [Bug #13222] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57651 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
ca82060640
commit
3203ae53ff
9
array.c
9
array.c
@ -5734,7 +5734,7 @@ rb_ary_dig(int argc, VALUE *argv, VALUE self)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static inline VALUE
|
static inline VALUE
|
||||||
finish_exact_sum(long n, VALUE r, VALUE v)
|
finish_exact_sum(long n, VALUE r, VALUE v, int z)
|
||||||
{
|
{
|
||||||
if (n != 0)
|
if (n != 0)
|
||||||
v = rb_fix_plus(LONG2FIX(n), v);
|
v = rb_fix_plus(LONG2FIX(n), v);
|
||||||
@ -5747,6 +5747,9 @@ finish_exact_sum(long n, VALUE r, VALUE v)
|
|||||||
else
|
else
|
||||||
v = rb_rational_plus(r, v);
|
v = rb_rational_plus(r, v);
|
||||||
}
|
}
|
||||||
|
else if (!n && z) {
|
||||||
|
v = rb_fix_plus(LONG2FIX(0), v);
|
||||||
|
}
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5831,11 +5834,11 @@ rb_ary_sum(int argc, VALUE *argv, VALUE ary)
|
|||||||
else
|
else
|
||||||
goto not_exact;
|
goto not_exact;
|
||||||
}
|
}
|
||||||
v = finish_exact_sum(n, r, v);
|
v = finish_exact_sum(n, r, v, argc!=0);
|
||||||
return v;
|
return v;
|
||||||
|
|
||||||
not_exact:
|
not_exact:
|
||||||
v = finish_exact_sum(n, r, v);
|
v = finish_exact_sum(n, r, v, i!=0);
|
||||||
|
|
||||||
if (RB_FLOAT_TYPE_P(e)) {
|
if (RB_FLOAT_TYPE_P(e)) {
|
||||||
/*
|
/*
|
||||||
|
@ -2838,6 +2838,9 @@ class TestArray < Test::Unit::TestCase
|
|||||||
assert_equal("abc", ["a", "b", "c"].sum(""))
|
assert_equal("abc", ["a", "b", "c"].sum(""))
|
||||||
assert_equal([1, [2], 3], [[1], [[2]], [3]].sum([]))
|
assert_equal([1, [2], 3], [[1], [[2]], [3]].sum([]))
|
||||||
|
|
||||||
|
assert_raise(TypeError) {[0].sum("")}
|
||||||
|
assert_raise(TypeError) {[1].sum("")}
|
||||||
|
|
||||||
assert_separately(%w[-rmathn], <<-EOS, ignore_stderr: true)
|
assert_separately(%w[-rmathn], <<-EOS, ignore_stderr: true)
|
||||||
assert_equal(6, [1r, 2, 3r].sum)
|
assert_equal(6, [1r, 2, 3r].sum)
|
||||||
EOS
|
EOS
|
||||||
|
Loading…
x
Reference in New Issue
Block a user