summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--numeric.c7
-rw-r--r--test/ruby/test_numeric.rb6
3 files changed, 16 insertions, 4 deletions
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 <matz@ruby-lang.org>
* 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 <knu@iDaemons.org>
* 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]')