From c2f9e1b1007c1d498fed23bc749305b3c47afea1 Mon Sep 17 00:00:00 2001 From: tadf Date: Thu, 9 Jun 2011 16:08:38 +0000 Subject: * ext/bigdecimal (BigDecimal_to_i): Integer#** may return flonum. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31976 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 4 ++++ ext/bigdecimal/bigdecimal.c | 13 +++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index a73de1cd88..adfa289951 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Fri Jun 10 01:06:29 2011 Tadayoshi Funaba + + * ext/bigdecimal (BigDecimal_to_i): Integer#** may return flonum. + Fri Jun 10 00:35:12 2011 Tadayoshi Funaba * complex.c (string_to_c_internal): uses rb_reg_nth_match; diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c index 353210b336..388dbbdcf8 100644 --- a/ext/bigdecimal/bigdecimal.c +++ b/ext/bigdecimal/bigdecimal.c @@ -564,19 +564,24 @@ BigDecimal_to_i(VALUE self) 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; } } -- cgit v1.2.3