diff options
author | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-03-14 04:41:16 +0000 |
---|---|---|
committer | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-03-14 04:41:16 +0000 |
commit | 5b65c6fcc83afef2109a8e8579ebf7598ecca3a4 (patch) | |
tree | ed60cb37fdcc40b21119afe17af20db037a97f4e | |
parent | f8c233ef19fd4550aa82c938b1f95cff876a5514 (diff) | |
download | ruby-5b65c6fcc83afef2109a8e8579ebf7598ecca3a4.tar.gz |
* numeric.c (fix2str): improve r54092 like rb_int2big().
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54098 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | numeric.c | 18 |
2 files changed, 11 insertions, 11 deletions
@@ -1,3 +1,7 @@ +Mon Mar 14 13:38:38 2016 NARUSE, Yui <naruse@ruby-lang.org> + + * numeric.c (fix2str): improve r54092 like rb_int2big(). + Mon Mar 14 10:02:23 2016 Eric Wong <e@80x24.org> * ext/openssl/ossl_ssl.c (ossl_sslctx_setup): document as MT-unsafe @@ -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 = '-'; } |