1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* bignum.c (MSB): Removed.

(BDIGIT_MSB): Defined using BIGRAD_HALF.
  (bary_2comp): Apply BIGLO after possible over flow of BDIGIT.
  (get2comp): Ditto.
  (bary_unpack_internal): Use BDIGIT_MSB.
  Apply BIGLO after possible over flow of BDIGIT.
  (rb_integer_unpack): Use BDIGIT_MSB.
  (calc_hbase): Use BDIGMAX.
  (big2dbl): Use BDIGMAX.
  Apply BIGLO after possible over flow of BDIGIT.
  (rb_big_neg): Apply BIGLO after possible over flow of BDIGIT.
  (biglsh_bang): Ditto.
  (bigrsh_bang): Ditto.
  (bary_divmod): Use BDIGIT_MSB.
  (bigdivrem): Ditto.
  (bigxor_int): Apply BIGLO after possible over flow of BDIGIT.

* marshal.c (shortlen): Use SIZEOF_BDIGITS instead of sizeof(BDIGIT).

* ext/openssl/ossl_bn.c (ossl_bn_initialize): Use SIZEOF_BDIGITS
  instead of sizeof(BDIGIT).



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41613 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
akr 2013-06-25 03:08:23 +00:00
parent 0a89315b83
commit 2b93ed5e76
4 changed files with 47 additions and 24 deletions

View file

@ -1,3 +1,27 @@
Tue Jun 25 12:07:18 2013 Tanaka Akira <akr@fsij.org>
* bignum.c (MSB): Removed.
(BDIGIT_MSB): Defined using BIGRAD_HALF.
(bary_2comp): Apply BIGLO after possible over flow of BDIGIT.
(get2comp): Ditto.
(bary_unpack_internal): Use BDIGIT_MSB.
Apply BIGLO after possible over flow of BDIGIT.
(rb_integer_unpack): Use BDIGIT_MSB.
(calc_hbase): Use BDIGMAX.
(big2dbl): Use BDIGMAX.
Apply BIGLO after possible over flow of BDIGIT.
(rb_big_neg): Apply BIGLO after possible over flow of BDIGIT.
(biglsh_bang): Ditto.
(bigrsh_bang): Ditto.
(bary_divmod): Use BDIGIT_MSB.
(bigdivrem): Ditto.
(bigxor_int): Apply BIGLO after possible over flow of BDIGIT.
* marshal.c (shortlen): Use SIZEOF_BDIGITS instead of sizeof(BDIGIT).
* ext/openssl/ossl_bn.c (ossl_bn_initialize): Use SIZEOF_BDIGITS
instead of sizeof(BDIGIT).
Tue Jun 25 11:40:08 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
* bignum.c (big2ulong): suppress shorten-64-to-32 warning. BDIGIT can

View file

@ -43,12 +43,11 @@ static VALUE big_three = Qnil;
#define CLEAR_LOWBITS(d, numbits) ((d) & LSHIFTX(~((d)*0), (numbits)))
#define FILL_LOWBITS(d, numbits) ((d) | (LSHIFTX(((d)*0+1), (numbits))-1))
#define MSB(d) (RSHIFT((d), sizeof(d) * CHAR_BIT - 1) & 1)
#define BDIGITS(x) (RBIGNUM_DIGITS(x))
#define BITSPERDIG (SIZEOF_BDIGITS*CHAR_BIT)
#define BIGRAD ((BDIGIT_DBL)1 << BITSPERDIG)
#define BIGRAD_HALF ((BDIGIT)(BIGRAD >> 1))
#define BDIGIT_MSB(d) (((d) & BIGRAD_HALF) != 0)
#if SIZEOF_LONG >= SIZEOF_BDIGITS
# define DIGSPERLONG (SIZEOF_LONG/SIZEOF_BDIGITS)
#endif
@ -271,7 +270,7 @@ bary_2comp(BDIGIT *ds, size_t n)
size_t i = n;
BDIGIT_DBL num;
if (!n) return 1;
while (i--) ds[i] = ~ds[i];
while (i--) ds[i] = BIGLO(~ds[i]);
i = 0; num = 1;
do {
num += ds[i];
@ -290,7 +289,7 @@ get2comp(VALUE x)
BDIGIT_DBL num;
if (!i) return;
while (i--) ds[i] = ~ds[i];
while (i--) ds[i] = BIGLO(~ds[i]);
i = 0; num = 1;
do {
num += ds[i];
@ -1460,7 +1459,7 @@ bary_unpack_internal(BDIGIT *bdigits, size_t num_bdigits, const void *words, siz
int zero_p = bary_2comp(dp, num_bdigits);
sign = zero_p ? -2 : -1;
}
else if (MSB(de[-1])) {
else if (BDIGIT_MSB(de[-1])) {
bary_2comp(dp, num_bdigits);
sign = -1;
}
@ -1535,7 +1534,7 @@ bary_unpack_internal(BDIGIT *bdigits, size_t num_bdigits, const void *words, siz
if (nlp_bits) {
if ((flags & INTEGER_PACK_NEGATIVE) ||
(bdigits[num_bdigits-1] >> (BITSPERDIG - nlp_bits - 1))) {
bdigits[num_bdigits-1] |= (~(BDIGIT)0) << (BITSPERDIG - nlp_bits);
bdigits[num_bdigits-1] |= BIGLO(BDIGMAX << (BITSPERDIG - nlp_bits));
sign = -1;
}
else {
@ -1547,7 +1546,7 @@ bary_unpack_internal(BDIGIT *bdigits, size_t num_bdigits, const void *words, siz
sign = bary_zero_p(bdigits, num_bdigits) ? -2 : -1;
}
else {
if (num_bdigits != 0 && MSB(bdigits[num_bdigits-1]))
if (num_bdigits != 0 && BDIGIT_MSB(bdigits[num_bdigits-1]))
sign = -1;
else
sign = 1;
@ -1693,7 +1692,7 @@ rb_integer_unpack(const void *words, size_t numwords, size_t wordsize, size_t na
return LONG2FIX(0);
if (0 < sign && POSFIXABLE(u))
return LONG2FIX(u);
if (sign < 0 && MSB(fixbuf[1]) == 0 &&
if (sign < 0 && BDIGIT_MSB(fixbuf[1]) == 0 &&
NEGFIXABLE(-(BDIGIT_DBL_SIGNED)u))
return LONG2FIX(-(BDIGIT_DBL_SIGNED)u);
val = bignew((long)num_bdigits, 0 <= sign);
@ -2281,7 +2280,7 @@ calc_hbase(int base, BDIGIT *hbase_p, int *hbase_numdigits_p)
hbase = base;
hbase_numdigits = 1;
while (hbase <= (~(BDIGIT)0) / base) {
while (hbase <= BDIGMAX / base) {
hbase *= base;
hbase_numdigits++;
}
@ -2611,7 +2610,7 @@ big2dbl(VALUE x)
}
dl = ds[i];
if (bits && (dl & (1UL << (bits %= BITSPERDIG)))) {
int carry = (dl & ~(~(BDIGIT)0 << bits)) != 0;
int carry = (dl & ~(BDIGMAX << bits)) != 0;
if (!carry) {
while (i-- > 0) {
carry = ds[i] != 0;
@ -2619,8 +2618,8 @@ big2dbl(VALUE x)
}
}
if (carry) {
dl &= (BDIGIT)~0 << bits;
dl += (BDIGIT)1 << bits;
dl &= BDIGMAX << bits;
dl = BIGLO(dl + ((BDIGIT)1 << bits));
if (!dl) d += 1;
}
}
@ -2999,7 +2998,7 @@ rb_big_neg(VALUE x)
i = RBIGNUM_LEN(x);
if (!i) return INT2FIX(~(SIGNED_VALUE)0);
while (i--) {
ds[i] = ~ds[i];
ds[i] = BIGLO(~ds[i]);
}
RBIGNUM_SET_SIGN(z, !RBIGNUM_SIGN(z));
if (RBIGNUM_SIGN(x)) get2comp(z);
@ -3603,10 +3602,10 @@ biglsh_bang(BDIGIT *xds, long xn, unsigned long shift)
}
zds = xds + xn - 1;
xn -= s1 + 1;
num = xds[xn]<<s2;
num = BIGLO(xds[xn]<<s2);
do {
*zds-- = num | xds[--xn]>>s3;
num = xds[xn]<<s2;
num = BIGLO(xds[xn]<<s2);
}
while (xn > 0);
*zds = num;
@ -3632,7 +3631,7 @@ bigrsh_bang(BDIGIT* xds, long xn, unsigned long shift)
zds = xds + s1;
num = *zds++>>s2;
do {
xds[i++] = (BDIGIT)(*zds<<s3) | num;
xds[i++] = BIGLO(*zds<<s3) | num;
num = *zds++>>s2;
}
while (i < xn - s1 - 1);
@ -4113,7 +4112,7 @@ bary_divmod(BDIGIT *qds, size_t nq, BDIGIT *rds, size_t nr, BDIGIT *xds, size_t
MEMCPY(zds, xds, BDIGIT, nx);
MEMZERO(zds+nx, BDIGIT, nz-nx);
if (MSB(yds[ny-1])) {
if (BDIGIT_MSB(yds[ny-1])) {
/* bigdivrem_normal will not modify y.
* So use yds directly. */
tds = yds;
@ -4177,7 +4176,7 @@ bigdivrem(VALUE x, VALUE y, volatile VALUE *divp, volatile VALUE *modp)
return Qnil;
}
if (MSB(yds[ny-1]) == 0) {
if (BDIGIT_MSB(yds[ny-1]) == 0) {
/* Make yds modifiable. */
tds = ALLOCV_N(BDIGIT, tmpy, ny);
MEMCPY(tds, yds, BDIGIT, ny);
@ -4772,7 +4771,7 @@ bigxor_int(VALUE x, long y)
}
#endif
while (i < xn) {
zds[i] = sign?xds[i]:~xds[i];
zds[i] = sign?xds[i]:BIGLO(~xds[i]);
i++;
}
if (!RBIGNUM_SIGN(z)) get2comp(z);
@ -4833,7 +4832,7 @@ rb_big_xor(VALUE xx, VALUE yy)
zds[i] = ds1[i] ^ ds2[i];
}
for (; i<l2; i++) {
zds[i] = sign?ds2[i]:~ds2[i];
zds[i] = sign?ds2[i]:BIGLO(~ds2[i]);
}
if (!RBIGNUM_SIGN(z)) get2comp(z);

View file

@ -147,14 +147,14 @@ ossl_bn_initialize(int argc, VALUE *argv, VALUE self)
for (i = 0; len > i; i++) {
BDIGIT v = ds[i];
for (j = sizeof(BDIGIT) - 1; 0 <= j; j--) {
bin[(len-1-i)*sizeof(BDIGIT)+j] = v&0xff;
for (j = SIZEOF_BDIGITS - 1; 0 <= j; j--) {
bin[(len-1-i)*SIZEOF_BDIGITS+j] = v&0xff;
v >>= 8;
}
}
GetBN(self, bn);
if (!BN_bin2bn(bin, (int)sizeof(BDIGIT)*len, bn)) {
if (!BN_bin2bn(bin, (int)SIZEOF_BDIGITS*len, bn)) {
ALLOCV_END(buf);
ossl_raise(eBNError, NULL);
}

View file

@ -42,7 +42,7 @@ shortlen(long len, BDIGIT *ds)
num = SHORTDN(num);
offset++;
}
return (len - 1)*sizeof(BDIGIT)/2 + offset;
return (len - 1)*SIZEOF_BDIGITS/2 + offset;
}
#define SHORTLEN(x) shortlen((x),d)
#endif