From a461f2f8bb5b79954421b6b3d3756f9011ad32e9 Mon Sep 17 00:00:00 2001 From: akr Date: Thu, 20 Jun 2013 15:42:23 +0000 Subject: * ext/bigdecimal: Workaround fix for bigdecimal test failures caused by [ruby-dev:47413] [Feature #8509] * ext/bigdecimal/bigdecimal.h (BDIGIT): Make it independent from the definition for bignum.c. (SIZEOF_BDIGITS): Ditto. (BDIGIT_DBL): Ditto. (BDIGIT_DBL_SIGNED): Ditto. (PRI_BDIGIT_PREFIX): Undefine the definition. (PRI_BDIGIT_DBL_PREFIX): Ditto. * ext/bigdecimal/bigdecimal.c (RBIGNUM_ZERO_P): Use rb_bigzero_p. (bigzero_p): Removed. (is_even): Use rb_big_pack. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41502 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 17 +++++++++++++++++ ext/bigdecimal/bigdecimal.c | 22 ++++++---------------- ext/bigdecimal/bigdecimal.h | 19 +++++++++++++++++++ 3 files changed, 42 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index b820c8a7f9..181815b4a3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +Fri Jun 21 00:37:31 2013 Tanaka Akira + + * ext/bigdecimal: Workaround fix for bigdecimal test failures caused + by [ruby-dev:47413] [Feature #8509] + + * ext/bigdecimal/bigdecimal.h (BDIGIT): Make it independent from the + definition for bignum.c. + (SIZEOF_BDIGITS): Ditto. + (BDIGIT_DBL): Ditto. + (BDIGIT_DBL_SIGNED): Ditto. + (PRI_BDIGIT_PREFIX): Undefine the definition. + (PRI_BDIGIT_DBL_PREFIX): Ditto. + + * ext/bigdecimal/bigdecimal.c (RBIGNUM_ZERO_P): Use rb_bigzero_p. + (bigzero_p): Removed. + (is_even): Use rb_big_pack. + Thu Jun 20 22:52:42 2013 Tanaka Akira * bignum.c (bigmul1_toom3): Don't call bignorm twice. diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c index 360a3e79d9..ba8777635f 100644 --- a/ext/bigdecimal/bigdecimal.c +++ b/ext/bigdecimal/bigdecimal.c @@ -86,23 +86,9 @@ static ID id_eq; #endif #ifndef RBIGNUM_ZERO_P -# define RBIGNUM_ZERO_P(x) (RBIGNUM_LEN(x) == 0 || \ - (RBIGNUM_DIGITS(x)[0] == 0 && \ - (RBIGNUM_LEN(x) == 1 || bigzero_p(x)))) +# define RBIGNUM_ZERO_P(x) rb_bigzero_p(x) #endif -static inline int -bigzero_p(VALUE x) -{ - long i; - BDIGIT *ds = RBIGNUM_DIGITS(x); - - for (i = RBIGNUM_LEN(x) - 1; 0 <= i; i--) { - if (ds[i]) return 0; - } - return 1; -} - #ifndef RRATIONAL_ZERO_P # define RRATIONAL_ZERO_P(x) (FIXNUM_P(RRATIONAL(x)->num) && \ FIX2LONG(RRATIONAL(x)->num) == 0) @@ -2130,7 +2116,11 @@ is_even(VALUE x) return (FIX2LONG(x) % 2) == 0; case T_BIGNUM: - return (RBIGNUM_DIGITS(x)[0] % 2) == 0; + { + unsigned long l; + rb_big_pack(x, &l, 1); + return l % 2 == 0; + } default: break; diff --git a/ext/bigdecimal/bigdecimal.h b/ext/bigdecimal/bigdecimal.h index ae32d5ffc5..a53ad47e81 100644 --- a/ext/bigdecimal/bigdecimal.h +++ b/ext/bigdecimal/bigdecimal.h @@ -19,6 +19,25 @@ #include "ruby/ruby.h" #include +#undef BDIGIT +#undef SIZEOF_BDIGITS +#undef BDIGIT_DBL +#undef BDIGIT_DBL_SIGNED +#undef PRI_BDIGIT_PREFIX +#undef PRI_BDIGIT_DBL_PREFIX + +#ifdef HAVE_INT64_T +# define BDIGIT uint32_t +# define BDIGIT_DBL uint64_t +# define BDIGIT_DBL_SIGNED int64_t +# define SIZEOF_BDIGITS 4 +#else +# define BDIGIT uint16_t +# define BDIGIT_DBL uint32_t +# define BDIGIT_DBL_SIGNED int32_t +# define SIZEOF_BDIGITS 2 +#endif + #if defined(__cplusplus) extern "C" { #if 0 -- cgit v1.2.3