diff --git a/ChangeLog b/ChangeLog index 13bea23e6b..5a70f8c493 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Mon Mar 14 13:38:38 2016 NARUSE, Yui + + * numeric.c (fix2str): improve r54092 like rb_int2big(). + Mon Mar 14 10:02:23 2016 Eric Wong * ext/openssl/ossl_ssl.c (ossl_sslctx_setup): document as MT-unsafe diff --git a/numeric.c b/numeric.c index c6c0cddf00..93e2bda2cd 100644 --- a/numeric.c +++ b/numeric.c @@ -2896,6 +2896,7 @@ rb_fix2str(VALUE x, int base) { char buf[SIZEOF_VALUE*CHAR_BIT + 1], *const e = buf + sizeof buf, *b = e; long val = FIX2LONG(x); + unsigned long u; int neg = 0; if (base < 2 || 36 < base) { @@ -2905,20 +2906,15 @@ rb_fix2str(VALUE x, int base) return rb_usascii_str_new2("0"); } if (val < 0) { - if (val == LONG_MIN) { - int last = ((int)((val = LONG_MAX) % base) + 1); - *--b = ruby_digitmap[last % base]; - val /= base; - val += last == base; /* carry */ - } - else { - val = -val; - } + u = 1 + (unsigned long)(-(val + 1)); /* u = -val avoiding overflow */ neg = 1; } + else { + u = val; + } do { - *--b = ruby_digitmap[(int)(val % base)]; - } while (val /= base); + *--b = ruby_digitmap[(int)(u % base)]; + } while (u /= base); if (neg) { *--b = '-'; }