ruby-changes:4764
From: ko1@a...
Date: Fri, 2 May 2008 00:00:43 +0900 (JST)
Subject: [ruby-changes:4764] nobu - Ruby:r16258 (trunk): * bignum.c (rb_big_divide), numeric.c (fix_divide): check for result
nobu 2008-05-02 00:00:01 +0900 (Fri, 02 May 2008) New Revision: 16258 Modified files: trunk/ChangeLog trunk/bignum.c trunk/numeric.c Log: * bignum.c (rb_big_divide), numeric.c (fix_divide): check for result domain. [ruby-dev:34559] http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/numeric.c?r1=16258&r2=16257&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=16258&r2=16257&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/bignum.c?r1=16258&r2=16257&diff_format=u Index: ChangeLog =================================================================== --- ChangeLog (revision 16257) +++ ChangeLog (revision 16258) @@ -1,3 +1,8 @@ +Thu May 1 23:59:59 2008 Nobuyoshi Nakada <nobu@r...> + + * bignum.c (rb_big_divide), numeric.c (fix_divide): check for result + domain. [ruby-dev:34559] + Thu May 1 23:43:21 2008 Nobuyoshi Nakada <nobu@r...> * range.c (range_step): check if step can be converted to an integer. Index: numeric.c =================================================================== --- numeric.c (revision 16257) +++ numeric.c (revision 16258) @@ -2249,7 +2249,7 @@ } static VALUE -fix_divide(VALUE x, VALUE y, int flo) +fix_divide(VALUE x, VALUE y, ID op) { if (FIXNUM_P(y)) { long div; @@ -2262,15 +2262,17 @@ x = rb_int2big(FIX2LONG(x)); return rb_big_div(x, y); case T_FLOAT: - if (flo) { - return DOUBLE2NUM((double)FIX2LONG(x) / RFLOAT_VALUE(y)); + { + double div = (double)FIX2LONG(x) / RFLOAT_VALUE(y); + if (op == '/') { + return DOUBLE2NUM(div); + } + else { + return rb_dbl2big(div); + } } - else { - long div = (double)FIX2LONG(x) / RFLOAT_VALUE(y); - return LONG2NUM(div); - } default: - return rb_num_coerce_bin(x, y, flo ? '/' : rb_intern("div")); + return rb_num_coerce_bin(x, y, op); } } @@ -2286,7 +2288,7 @@ static VALUE fix_div(VALUE x, VALUE y) { - return fix_divide(x, y, Qtrue); + return fix_divide(x, y, '/'); } /* @@ -2299,7 +2301,7 @@ static VALUE fix_idiv(VALUE x, VALUE y) { - return fix_divide(x, y, Qfalse); + return fix_divide(x, y, rb_intern("div")); } /* Index: bignum.c =================================================================== --- bignum.c (revision 16257) +++ bignum.c (revision 16258) @@ -1821,7 +1821,7 @@ return DOUBLE2NUM(div); } else { - return LONG2NUM((long)div); + return rb_dbl2big(div); } } -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/