diff --git a/ChangeLog b/ChangeLog index 296ce35b2f..bccfe4b514 100644 --- a/ChangeLog +++ b/ChangeLog @@ -31,6 +31,13 @@ Tue May 27 15:36:27 2008 Yukihiro Matsumoto * numeric.c (num_fdiv): fallback to_f should always return float result. should not use #quo that may return rational. + * numeric.c (num_div): should raise ZeroDivisionError. + + * numeric.c (fix_divide): ditto. + + * test/ruby/test_numeric.rb (TestNumeric::test_divmod): avoid + ZeroDivisionError in tests. + Tue May 27 13:14:53 2008 Akinori MUSHA * enum.c (enum_to_a): Pass arguments through to #each(). diff --git a/numeric.c b/numeric.c index ea931b2275..36bf6b6fd2 100644 --- a/numeric.c +++ b/numeric.c @@ -288,6 +288,7 @@ static VALUE num_floor(VALUE num); static VALUE num_div(VALUE x, VALUE y) { + if (rb_equal(INT2FIX(0), y)) rb_num_zerodiv(); return num_floor(rb_funcall(x, '/', 1, y)); } @@ -2261,11 +2262,15 @@ fix_divide(VALUE x, VALUE y, ID op) return rb_big_div(x, y); case T_FLOAT: { - double div = (double)FIX2LONG(x) / RFLOAT_VALUE(y); + double div; + if (op == '/') { + div = (double)FIX2LONG(x) / RFLOAT_VALUE(y); return DOUBLE2NUM(div); } else { + if (RFLOAT_VALUE(y) == 0) rb_num_zerodiv(); + div = (double)FIX2LONG(x) / RFLOAT_VALUE(y); return rb_dbl2big(floor(div)); } } diff --git a/test/ruby/test_numeric.rb b/test/ruby/test_numeric.rb index b1edb8fe47..3db054fdae 100644 --- a/test/ruby/test_numeric.rb +++ b/test/ruby/test_numeric.rb @@ -60,9 +60,9 @@ class TestNumeric < Test::Unit::TestCase def %(x); :mod; end end - assert_equal(42, DummyNumeric.new.div(0)) - assert_equal(:mod, DummyNumeric.new.modulo(0)) - assert_equal([42, :mod], DummyNumeric.new.divmod(0)) + assert_equal(42, DummyNumeric.new.div(1)) + assert_equal(:mod, DummyNumeric.new.modulo(1)) + assert_equal([42, :mod], DummyNumeric.new.divmod(1)) assert_kind_of(Integer, 11.divmod(3.5).first, '[ruby-dev:34006]')