diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-02-18 04:23:20 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-02-18 04:23:20 +0000 |
commit | 3203ae53ffeea05c7719d4ba863e0ca492b305cd (patch) | |
tree | 7966e8308cb1825df565b602eb197439f5a993aa | |
parent | ca82060640bc33925b8cd2e5f984dc221795ac5e (diff) |
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
-rw-r--r-- | array.c | 9 | ||||
-rw-r--r-- | test/ruby/test_array.rb | 3 |
2 files changed, 9 insertions, 3 deletions
@@ -5734,7 +5734,7 @@ rb_ary_dig(int argc, VALUE *argv, VALUE self) } 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) v = rb_fix_plus(LONG2FIX(n), v); @@ -5747,6 +5747,9 @@ finish_exact_sum(long n, VALUE r, VALUE v) else v = rb_rational_plus(r, v); } + else if (!n && z) { + v = rb_fix_plus(LONG2FIX(0), v); + } return v; } @@ -5831,11 +5834,11 @@ rb_ary_sum(int argc, VALUE *argv, VALUE ary) else goto not_exact; } - v = finish_exact_sum(n, r, v); + v = finish_exact_sum(n, r, v, argc!=0); return v; not_exact: - v = finish_exact_sum(n, r, v); + v = finish_exact_sum(n, r, v, i!=0); if (RB_FLOAT_TYPE_P(e)) { /* diff --git a/test/ruby/test_array.rb b/test/ruby/test_array.rb index 08100142f8..b0be0b4a87 100644 --- a/test/ruby/test_array.rb +++ b/test/ruby/test_array.rb @@ -2838,6 +2838,9 @@ class TestArray < Test::Unit::TestCase assert_equal("abc", ["a", "b", "c"].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_equal(6, [1r, 2, 3r].sum) EOS |