diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | numeric.c | 10 |
2 files changed, 14 insertions, 1 deletions
@@ -1,3 +1,8 @@ +Sun Mar 13 09:15:45 2016 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * numeric.c (rb_fix2str): fix edge case, accidentally generated + wrong Fixnum from LONG_MIN. + Sat Mar 12 09:50:27 2016 Nobuyoshi Nakada <nobu@ruby-lang.org> * vm_eval.c (rb_f_catch): [DOC] fix malformed RDoc syntax, "+...+" @@ -2905,7 +2905,15 @@ rb_fix2str(VALUE x, int base) return rb_usascii_str_new2("0"); } if (val < 0) { - val = -val; + 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; + } neg = 1; } do { |