diff --git a/ChangeLog b/ChangeLog index 6544e6bd8e..57775f6cfa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,23 @@ +Fri Jun 10 16:06:25 2016 Nobuyoshi Nakada + + * include/ruby/missing.h (isfinite): move from numeric.c. + +Fri Jun 10 16:06:25 2016 NAKAMURA Usaku + + * ext/bigdecimal/bigdecimal.c (isfinite): get rid of a warning on + cygwin. [Bug #12417][ruby-core:75691] + +Fri Jun 10 16:06:25 2016 NAKAMURA Usaku + + * ext/bigdecimal/bigdecimal.c (isfinite): isfinite does not always + exist. fixed build error on Windows introduced at r55123. + +Fri Jun 10 16:06:25 2016 Nobuyoshi Nakada + + * ext/bigdecimal/bigdecimal.c (GetVpValueWithPrec): consider + non-finite float values not to raise FloatDomainError. + [ruby-core:75682] [Bug #12414] + Fri Jun 10 16:00:27 2016 NAKAMURA Usaku * thread.c (recursive_list_access): a object id may be a Bignum. so, diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c index 11a7109635..b4166ae376 100644 --- a/ext/bigdecimal/bigdecimal.c +++ b/ext/bigdecimal/bigdecimal.c @@ -215,6 +215,12 @@ again: if (prec < 0) goto unable_to_coerce_without_prec; if (prec > DBL_DIG+1) goto SomeOneMayDoIt; d = RFLOAT_VALUE(v); + if (!isfinite(d)) { + pv = VpCreateRbObject(prec, NULL); + pv->sign = isnan(d) ? VP_SIGN_NaN : + d > 0 ? VP_SIGN_POSITIVE_INFINITE : VP_SIGN_NEGATIVE_FINITE; + return pv; + } if (d != 0.0) { v = rb_funcall(v, id_to_r, 0); goto again; diff --git a/include/ruby/missing.h b/include/ruby/missing.h index 161d95430a..1c414112b6 100644 --- a/include/ruby/missing.h +++ b/include/ruby/missing.h @@ -171,6 +171,13 @@ RUBY_EXTERN int isnan(double); # endif #endif +#ifndef isfinite +# ifndef HAVE_ISFINITE +# define HAVE_ISFINITE 1 +# define isfinite(x) finite(x) +# endif +#endif + #ifndef HAVE_NEXTAFTER RUBY_EXTERN double nextafter(double x, double y); #endif diff --git a/numeric.c b/numeric.c index 5310f047e4..2cf2c05292 100644 --- a/numeric.c +++ b/numeric.c @@ -28,14 +28,6 @@ #include #endif -#if !defined HAVE_ISFINITE && !defined isfinite -#if defined HAVE_FINITE && !defined finite && !defined _WIN32 -extern int finite(double); -# define HAVE_ISFINITE 1 -# define isfinite(x) finite(x) -#endif -#endif - /* use IEEE 64bit values if not defined */ #ifndef FLT_RADIX #define FLT_RADIX 2 diff --git a/test/bigdecimal/test_bigdecimal.rb b/test/bigdecimal/test_bigdecimal.rb index 042d11da0f..b498df4601 100644 --- a/test/bigdecimal/test_bigdecimal.rb +++ b/test/bigdecimal/test_bigdecimal.rb @@ -458,6 +458,18 @@ class TestBigDecimal < Test::Unit::TestCase assert_equal(false, BigDecimal.new("NaN") > n1) end + def test_cmp_float_nan + assert_equal(nil, BigDecimal.new("1") <=> Float::NAN) + end + + def test_cmp_float_pos_inf + assert_equal(-1, BigDecimal.new("1") <=> Float::INFINITY) + end + + def test_cmp_float_neg_inf + assert_equal(+1, BigDecimal.new("1") <=> -Float::INFINITY) + end + def test_cmp_failing_coercion n1 = BigDecimal.new("1") assert_equal(nil, n1 <=> nil) diff --git a/version.h b/version.h index ab21fce89e..fa356cbe88 100644 --- a/version.h +++ b/version.h @@ -1,6 +1,6 @@ #define RUBY_VERSION "2.2.6" #define RUBY_RELEASE_DATE "2016-06-10" -#define RUBY_PATCHLEVEL 329 +#define RUBY_PATCHLEVEL 330 #define RUBY_RELEASE_YEAR 2016 #define RUBY_RELEASE_MONTH 6