ruby-changes:19929
From: tadf <ko1@a...>
Date: Fri, 10 Jun 2011 01:08:49 +0900 (JST)
Subject: [ruby-changes:19929] tadf:r31976 (trunk): * ext/bigdecimal (BigDecimal_to_i): Integer#** may return flonum.
tadf 2011-06-10 01:08:38 +0900 (Fri, 10 Jun 2011) New Revision: 31976 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=31976 Log: * ext/bigdecimal (BigDecimal_to_i): Integer#** may return flonum. Modified files: trunk/ChangeLog trunk/ext/bigdecimal/bigdecimal.c Index: ChangeLog =================================================================== --- ChangeLog (revision 31975) +++ ChangeLog (revision 31976) @@ -1,3 +1,7 @@ +Fri Jun 10 01:06:29 2011 Tadayoshi Funaba <tadf@d...> + + * ext/bigdecimal (BigDecimal_to_i): Integer#** may return flonum. + Fri Jun 10 00:35:12 2011 Tadayoshi Funaba <tadf@d...> * complex.c (string_to_c_internal): uses rb_reg_nth_match; Index: ext/bigdecimal/bigdecimal.c =================================================================== --- ext/bigdecimal/bigdecimal.c (revision 31975) +++ ext/bigdecimal/bigdecimal.c (revision 31976) @@ -564,19 +564,24 @@ VALUE a = BigDecimal_split(self); VALUE digits = RARRAY_PTR(a)[1]; VALUE numerator = rb_funcall(digits, rb_intern("to_i"), 0); + VALUE ret; ssize_t dpower = e - (ssize_t)RSTRING_LEN(digits); if (VpGetSign(p) < 0) { numerator = rb_funcall(numerator, '*', 1, INT2FIX(-1)); } if (dpower < 0) { - return rb_funcall(numerator, rb_intern("div"), 1, + ret = rb_funcall(numerator, rb_intern("div"), 1, rb_funcall(INT2FIX(10), rb_intern("**"), 1, INT2FIX(-dpower))); } - return rb_funcall(numerator, '*', 1, - rb_funcall(INT2FIX(10), rb_intern("**"), 1, - INT2FIX(dpower))); + else + ret = rb_funcall(numerator, '*', 1, + rb_funcall(INT2FIX(10), rb_intern("**"), 1, + INT2FIX(dpower))); + if (TYPE(ret) == T_FLOAT) + rb_raise(rb_eFloatDomainError, "Infinity"); + return ret; } } -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/