diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | array.c | 22 | ||||
-rw-r--r-- | test/ruby/test_array.rb | 4 |
3 files changed, 28 insertions, 4 deletions
@@ -1,3 +1,9 @@ +Sun May 1 23:59:59 2016 Kenta Murata <[email protected]> + + * array.c (rb_ary_sum): fix for mathn + + * test/ruby/test_array.rb (test_sum): ditto. + Sun May 1 23:51:54 2016 NAKAMURA Usaku <[email protected]> * test/lib/test/unit.rb (Options#non_options): fixed wrong regexp. @@ -5732,15 +5732,29 @@ rb_ary_sum(int argc, VALUE *argv, VALUE ary) } if (n != 0) v = rb_fix_plus(LONG2FIX(n), v); - if (r != Qundef) - v = rb_rational_plus(r, v); + if (r != Qundef) { + /* r can be a Integer when mathn is loaded */ + if (FIXNUM_P(r)) + v = rb_fix_plus(r, v); + else if (RB_TYPE_P(r, T_BIGNUM)) + v = rb_big_plus(r, v); + else + v = rb_rational_plus(r, v); + } return v; not_exact: if (n != 0) v = rb_fix_plus(LONG2FIX(n), v); - if (r != Qundef) - v = rb_rational_plus(r, v); + if (r != Qundef) { + /* r can be a Integer when mathn is loaded */ + if (FIXNUM_P(r)) + v = rb_fix_plus(r, v); + else if (RB_TYPE_P(r, T_BIGNUM)) + v = rb_big_plus(r, v); + else + v = rb_rational_plus(r, v); + } if (RB_FLOAT_TYPE_P(e)) { /* Kahan's compensated summation algorithm */ diff --git a/test/ruby/test_array.rb b/test/ruby/test_array.rb index 36f2b7d72d..44eec9143d 100644 --- a/test/ruby/test_array.rb +++ b/test/ruby/test_array.rb @@ -2789,6 +2789,10 @@ class TestArray < Test::Unit::TestCase assert_equal("abc", ["a", "b", "c"].sum("")) assert_equal([1, [2], 3], [[1], [[2]], [3]].sum([])) + + assert_separately(%w[-rmathn], <<-EOS, ignore_stderr: true) + assert_equal(6, [1r, 2, 3r].sum) + EOS end private |