[前][次][番号順一覧][スレッド一覧]

ruby-changes:5155

From: matz <ko1@a...>
Date: Tue, 27 May 2008 21:51:53 +0900 (JST)
Subject: [ruby-changes:5155] Ruby:r16650 (trunk): * numeric.c (num_div): should raise ZeroDivisionError.

matz	2008-05-27 21:51:28 +0900 (Tue, 27 May 2008)

  New Revision: 16650

  Modified files:
    trunk/ChangeLog
    trunk/numeric.c
    trunk/test/ruby/test_numeric.rb

  Log:
    * numeric.c (num_div): should raise ZeroDivisionError.
    
    * numeric.c (fix_divide): ditto.
    
    * test/ruby/test_numeric.rb (TestNumeric::test_divmod): avoid
      ZeroDivisionError in tests.

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/numeric.c?r1=16650&r2=16649&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=16650&r2=16649&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/ruby/test_numeric.rb?r1=16650&r2=16649&diff_format=u

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 16649)
+++ ChangeLog	(revision 16650)
@@ -31,6 +31,13 @@
 	* 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@i...>
 
 	* enum.c (enum_to_a): Pass arguments through to #each().
Index: numeric.c
===================================================================
--- numeric.c	(revision 16649)
+++ numeric.c	(revision 16650)
@@ -288,6 +288,7 @@
 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 @@
 	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));
 	    }
 	}
Index: test/ruby/test_numeric.rb
===================================================================
--- test/ruby/test_numeric.rb	(revision 16649)
+++ test/ruby/test_numeric.rb	(revision 16650)
@@ -60,9 +60,9 @@
       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]')
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]