diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-11-25 18:19:07 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-11-25 18:19:07 +0000 |
commit | f1205dfeaad01a56d9eecf4afa3d442c6f99a07f (patch) | |
tree | b25ce5d13b1c117973d8cfcbbc1f02ab1885f42e | |
parent | 797646a37adb04d7ff035fd45592bc711e4d9983 (diff) | |
download | ruby-f1205dfeaad01a56d9eecf4afa3d442c6f99a07f.tar.gz ruby-f1205dfeaad01a56d9eecf4afa3d442c6f99a07f.tar.xz ruby-f1205dfeaad01a56d9eecf4afa3d442c6f99a07f.zip |
* ext/bigdecimal/bigdecimal.c (BigDecimal_to_r): raise exception
for nan/inf conversion. [ruby-dev:37187] fix #793
* ext/bigdecimal/bigdecimal.c (BigDecimal_to_i): ditto.
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@20360 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | ext/bigdecimal/bigdecimal.c | 27 |
2 files changed, 22 insertions, 12 deletions
@@ -1,3 +1,10 @@ +Wed Nov 26 03:17:48 2008 Yukihiro Matsumoto <matz@ruby-lang.org> + + * ext/bigdecimal/bigdecimal.c (BigDecimal_to_r): raise exception + for nan/inf conversion. [ruby-dev:37187] fix #793 + + * ext/bigdecimal/bigdecimal.c (BigDecimal_to_i): ditto. + Wed Nov 26 03:00:59 2008 Yukihiro Matsumoto <matz@ruby-lang.org> * ext/bigdecimal/bigdecimal.c (VpAlloc): avoid ALLOCA_N() to avoid diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c index 19aeb2e0c..66ab12bca 100644 --- a/ext/bigdecimal/bigdecimal.c +++ b/ext/bigdecimal/bigdecimal.c @@ -521,6 +521,18 @@ BigDecimal_IsFinite(VALUE self) return Qtrue; } +static void +BigDecimal_check_num(Real *p) +{ + if(VpIsNaN(p)) { + VpException(VP_EXCEPTION_NaN,"Computation results to 'NaN'(Not a Number)",1); + } else if(VpIsPosInf(p)) { + VpException(VP_EXCEPTION_INFINITY,"Computation results to 'Infinity'",1); + } else if(VpIsNegInf(p)) { + VpException(VP_EXCEPTION_INFINITY,"Computation results to '-Infinity'",1); + } +} + /* Returns the value as an integer (Fixnum or Bignum). * * If the BigNumber is infinity or NaN, returns nil. @@ -536,18 +548,7 @@ BigDecimal_to_i(VALUE self) Real *p; GUARD_OBJ(p,GetVpValue(self,1)); - - /* Infinity or NaN not converted. */ - if(VpIsNaN(p)) { - VpException(VP_EXCEPTION_NaN,"Computation results to 'NaN'(Not a Number)",1); - return Qnil; /* not reached */ - } else if(VpIsPosInf(p)) { - VpException(VP_EXCEPTION_INFINITY,"Computation results to 'Infinity'",1); - return Qnil; /* not reached */ - } else if(VpIsNegInf(p)) { - VpException(VP_EXCEPTION_INFINITY,"Computation results to '-Infinity'",1); - return Qnil; /* not reached */ - } + BigDecimal_check_num(p); e = VpExponent10(p); if(e<=0) return INT2FIX(0); @@ -625,6 +626,8 @@ BigDecimal_to_r(VALUE self) VALUE a, digits, numerator; p = GetVpValue(self,1); + BigDecimal_check_num(p); + sign = VpGetSign(p); power = VpExponent10(p); a = BigDecimal_split(self); |