ruby-changes:29376
From: akr <ko1@a...>
Date: Wed, 19 Jun 2013 19:36:33 +0900 (JST)
Subject: [ruby-changes:29376] akr:r41428 (trunk): * bignum.c (DIGSPERLONG): Don't define if BDIGIT is bigger than long.
akr 2013-06-19 19:36:22 +0900 (Wed, 19 Jun 2013) New Revision: 41428 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=41428 Log: * bignum.c (DIGSPERLONG): Don't define if BDIGIT is bigger than long. (DIGSPERLL): Don't define if BDIGIT is bigger than LONG_LONG (rb_absint_size): Consider environments BDIGIT is bigger than long. Use BIGLO and BIGDN. (rb_absint_singlebit_p): Ditto. (rb_integer_pack): Ditto. (bigsub_int): Consider environments BDIGIT is bigger than long. Use SIZEOF_BDIGITS instead of sizeof(BDIGIT). (bigadd_int): Ditto. (bigand_int): Ditto. (bigor_int): Ditto. (bigxor_int): Ditto. Modified files: trunk/ChangeLog trunk/bignum.c Index: ChangeLog =================================================================== --- ChangeLog (revision 41427) +++ ChangeLog (revision 41428) @@ -1,3 +1,18 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 +Wed Jun 19 19:31:30 2013 Tanaka Akira <akr@f...> + + * bignum.c (DIGSPERLONG): Don't define if BDIGIT is bigger than long. + (DIGSPERLL): Don't define if BDIGIT is bigger than LONG_LONG + (rb_absint_size): Consider environments BDIGIT is bigger than long. + Use BIGLO and BIGDN. + (rb_absint_singlebit_p): Ditto. + (rb_integer_pack): Ditto. + (bigsub_int): Consider environments BDIGIT is bigger than long. + Use SIZEOF_BDIGITS instead of sizeof(BDIGIT). + (bigadd_int): Ditto. + (bigand_int): Ditto. + (bigor_int): Ditto. + (bigxor_int): Ditto. + Wed Jun 19 15:14:30 2013 Koichi Sasada <ko1@a...> * include/ruby/ruby.h (struct rb_data_type_struct), gc.c: add Index: bignum.c =================================================================== --- bignum.c (revision 41427) +++ bignum.c (revision 41428) @@ -37,8 +37,10 @@ static VALUE big_three = Qnil; https://github.com/ruby/ruby/blob/trunk/bignum.c#L37 #define BITSPERDIG (SIZEOF_BDIGITS*CHAR_BIT) #define BIGRAD ((BDIGIT_DBL)1 << BITSPERDIG) #define BIGRAD_HALF ((BDIGIT)(BIGRAD >> 1)) -#define DIGSPERLONG (SIZEOF_LONG/SIZEOF_BDIGITS) -#if HAVE_LONG_LONG +#if SIZEOF_LONG >= SIZEOF_BDIGITS +# define DIGSPERLONG (SIZEOF_LONG/SIZEOF_BDIGITS) +#endif +#if defined(HAVE_LONG_LONG) && SIZEOF_LONG_LONG >= SIZEOF_BDIGITS # define DIGSPERLL (SIZEOF_LONG_LONG/SIZEOF_BDIGITS) #endif #define BIGUP(x) ((BDIGIT_DBL)(x) << BITSPERDIG) @@ -526,14 +528,14 @@ rb_absint_size(VALUE val, int *nlz_bits_ https://github.com/ruby/ruby/blob/trunk/bignum.c#L528 if (v < 0) { v = -v; } -#if SIZEOF_BDIGITS == SIZEOF_LONG +#if SIZEOF_BDIGITS >= SIZEOF_LONG fixbuf[0] = v; #else { int i; for (i = 0; i < numberof(fixbuf); i++) { - fixbuf[i] = (BDIGIT)(v & ((1L << (SIZEOF_BDIGITS * CHAR_BIT)) - 1)); - v >>= SIZEOF_BDIGITS * CHAR_BIT; + fixbuf[i] = BIGLO(v); + v = BIGDN(v); } } #endif @@ -690,14 +692,14 @@ rb_absint_singlebit_p(VALUE val) https://github.com/ruby/ruby/blob/trunk/bignum.c#L692 if (v < 0) { v = -v; } -#if SIZEOF_BDIGITS == SIZEOF_LONG +#if SIZEOF_BDIGITS >= SIZEOF_LONG fixbuf[0] = v; #else { int i; for (i = 0; i < numberof(fixbuf); i++) { - fixbuf[i] = (BDIGIT)(v & ((1L << (SIZEOF_BDIGITS * CHAR_BIT)) - 1)); - v >>= SIZEOF_BDIGITS * CHAR_BIT; + fixbuf[i] = BIGLO(v); + v = BIGDN(v); } } #endif @@ -1098,14 +1100,14 @@ rb_integer_pack(VALUE val, void *words, https://github.com/ruby/ruby/blob/trunk/bignum.c#L1100 else { sign = 1; } -#if SIZEOF_BDIGITS == SIZEOF_LONG +#if SIZEOF_BDIGITS >= SIZEOF_LONG fixbuf[0] = v; #else { int i; for (i = 0; i < numberof(fixbuf); i++) { - fixbuf[i] = (BDIGIT)(v & ((1L << (SIZEOF_BDIGITS * CHAR_BIT)) - 1)); - v >>= SIZEOF_BDIGITS * CHAR_BIT; + fixbuf[i] = BIGLO(v); + v = BIGDN(v); } } #endif @@ -2908,7 +2910,7 @@ bigsub_int(VALUE x, long y0) https://github.com/ruby/ruby/blob/trunk/bignum.c#L2910 z = bignew(xn, RBIGNUM_SIGN(x)); zds = BDIGITS(z); -#if SIZEOF_BDIGITS == SIZEOF_LONG +#if SIZEOF_BDIGITS >= SIZEOF_LONG num = (BDIGIT_DBL_SIGNED)xds[0] - y; if (xn == 1 && num < 0) { RBIGNUM_SET_SIGN(z, !RBIGNUM_SIGN(x)); @@ -2921,7 +2923,7 @@ bigsub_int(VALUE x, long y0) https://github.com/ruby/ruby/blob/trunk/bignum.c#L2923 i = 1; #else num = 0; - for (i=0; i<(int)(sizeof(y)/sizeof(BDIGIT)); i++) { + for (i=0; i<(int)(sizeof(y)/SIZEOF_BDIGITS); i++) { num += (BDIGIT_DBL_SIGNED)xds[i] - BIGLO(y); zds[i] = BIGLO(num); num = BIGDN(num); @@ -2965,14 +2967,14 @@ bigadd_int(VALUE x, long y) https://github.com/ruby/ruby/blob/trunk/bignum.c#L2967 z = bignew(zn, RBIGNUM_SIGN(x)); zds = BDIGITS(z); -#if SIZEOF_BDIGITS == SIZEOF_LONG +#if SIZEOF_BDIGITS >= SIZEOF_LONG num = (BDIGIT_DBL)xds[0] + y; zds[0] = BIGLO(num); num = BIGDN(num); i = 1; #else num = 0; - for (i=0; i<(int)(sizeof(y)/sizeof(BDIGIT)); i++) { + for (i=0; i<(int)(sizeof(y)/SIZEOF_BDIGITS); i++) { num += (BDIGIT_DBL)xds[i] + BIGLO(y); zds[i] = BIGLO(num); num = BIGDN(num); @@ -4369,7 +4371,7 @@ bigand_int(VALUE x, long y) https://github.com/ruby/ruby/blob/trunk/bignum.c#L4371 sign = (y > 0); xds = BDIGITS(x); zn = xn = RBIGNUM_LEN(x); -#if SIZEOF_BDIGITS == SIZEOF_LONG +#if SIZEOF_BDIGITS >= SIZEOF_LONG if (sign) { y &= xds[0]; return LONG2NUM(y); @@ -4379,14 +4381,14 @@ bigand_int(VALUE x, long y) https://github.com/ruby/ruby/blob/trunk/bignum.c#L4381 z = bignew(zn, RBIGNUM_SIGN(x) || sign); zds = BDIGITS(z); -#if SIZEOF_BDIGITS == SIZEOF_LONG +#if SIZEOF_BDIGITS >= SIZEOF_LONG i = 1; zds[0] = xds[0] & y; #else { BDIGIT_DBL num = y; - for (i=0; i<(int)(sizeof(y)/sizeof(BDIGIT)); i++) { + for (i=0; i<(int)(sizeof(y)/SIZEOF_BDIGITS); i++) { zds[i] = xds[i] & BIGLO(num); num = BIGDN(num); } @@ -4475,14 +4477,14 @@ bigor_int(VALUE x, long y) https://github.com/ruby/ruby/blob/trunk/bignum.c#L4477 z = bignew(zn, RBIGNUM_SIGN(x) && sign); zds = BDIGITS(z); -#if SIZEOF_BDIGITS == SIZEOF_LONG +#if SIZEOF_BDIGITS >= SIZEOF_LONG i = 1; zds[0] = xds[0] | y; #else { BDIGIT_DBL num = y; - for (i=0; i<(int)(sizeof(y)/sizeof(BDIGIT)); i++) { + for (i=0; i<(int)(sizeof(y)/SIZEOF_BDIGITS); i++) { zds[i] = xds[i] | BIGLO(num); num = BIGDN(num); } @@ -4571,14 +4573,14 @@ bigxor_int(VALUE x, long y) https://github.com/ruby/ruby/blob/trunk/bignum.c#L4573 z = bignew(zn, !(RBIGNUM_SIGN(x) ^ sign)); zds = BDIGITS(z); -#if SIZEOF_BDIGITS == SIZEOF_LONG +#if SIZEOF_BDIGITS >= SIZEOF_LONG i = 1; zds[0] = xds[0] ^ y; #else { BDIGIT_DBL num = y; - for (i=0; i<(int)(sizeof(y)/sizeof(BDIGIT)); i++) { + for (i=0; i<(int)(sizeof(y)/SIZEOF_BDIGITS); i++) { zds[i] = xds[i] ^ BIGLO(num); num = BIGDN(num); } -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/