Author: Armin Rigo <ar...@tunes.org> Branch: remove-raisingops Changeset: r84710:a66f6ef2340a Date: 2016-05-26 17:05 +0200 http://bitbucket.org/pypy/pypy/changeset/a66f6ef2340a/
Log: Fix the logic in newformat for value == -sys.maxint-1: we can't call abs(value) on that. diff --git a/pypy/objspace/std/newformat.py b/pypy/objspace/std/newformat.py --- a/pypy/objspace/std/newformat.py +++ b/pypy/objspace/std/newformat.py @@ -7,6 +7,7 @@ from rpython.rlib import rstring, runicode, rlocale, rfloat, jit from rpython.rlib.objectmodel import specialize from rpython.rlib.rfloat import copysign, formatd +from rpython.rlib.rarithmetic import r_uint, intmask @specialize.argtype(1) @@ -828,33 +829,37 @@ return s # This part is slow. negative = value < 0 - value = abs(value) + base = r_uint(base) + value = r_uint(value) + if negative: # change the sign on the unsigned number: otherwise, + value = -value # we'd risk overflow if value==-sys.maxint-1 + # buf = ["\0"] * (8 * 8 + 6) # Too much on 32 bit, but who cares? i = len(buf) - 1 while True: - div = value // base - mod = value - div * base - digit = abs(mod) + div = value // base # unsigned + mod = value - div * base # unsigned, always in range(0,base) + digit = intmask(mod) digit += ord("0") if digit < 10 else ord("a") - 10 buf[i] = chr(digit) - value = div + value = div # unsigned i -= 1 if not value: break - if base == 2: + if base == r_uint(2): buf[i] = "b" buf[i - 1] = "0" - elif base == 8: + elif base == r_uint(8): buf[i] = "o" buf[i - 1] = "0" - elif base == 16: + elif base == r_uint(16): buf[i] = "x" buf[i - 1] = "0" else: buf[i] = "#" - buf[i - 1] = chr(ord("0") + base % 10) - if base > 10: - buf[i - 2] = chr(ord("0") + base // 10) + buf[i - 1] = chr(ord("0") + intmask(base % r_uint(10))) + if base > r_uint(10): + buf[i - 2] = chr(ord("0") + intmask(base // r_uint(10))) i -= 1 i -= 1 if negative: _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit