diff --git a/ChangeLog b/ChangeLog index 82b6fd960a..ad79809812 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Fri Feb 22 19:50:19 2008 Nobuyoshi Nakada + + * bignum.c (BIGZEROP): fix for longer Bignum zeros. [ruby-Bugs-17454] + Fri Feb 22 15:47:36 2008 Tanaka Akira * encoding.c (rb_enc_mbclen): return minlen instead of 1 when diff --git a/bignum.c b/bignum.c index 2119b7d9aa..7220b80a36 100644 --- a/bignum.c +++ b/bignum.c @@ -36,7 +36,19 @@ VALUE rb_cBignum; #define BIGLO(x) ((BDIGIT)((x) & (BIGRAD-1))) #define BDIGMAX ((BDIGIT)-1) -#define BIGZEROP(x) (RBIGNUM_LEN(x) == 0 || (RBIGNUM_LEN(x) == 1 && BDIGITS(x)[0] == 0)) +#define BIGZEROP(x) (RBIGNUM_LEN(x) == 0 || \ + (BDIGITS(x)[0] == 0 && \ + (RBIGNUM_LEN(x) == 1 || bigzero_p(x)))) + +static int +bigzero_p(VALUE x) +{ + long i; + for (i = 0; i < RBIGNUM_LEN(x); ++i) { + if (BDIGITS(x)[i]) return 0; + } + return 1; +} #define RBIGNUM_SET_LEN(b,l) \ ((RBASIC(b)->flags & RBIGNUM_EMBED_FLAG) ? \