Issue 1446922: Patch for bug 1441486: bad unary minus folding in compiler (original) (raw)
In the old compiler, there was a optimization in com_factor that folded a unary minus against a constant.
In the new AST, it looks like numbers are converted from strings into PyObjects earlier in the pipeline. The compiler does fold a unary minus against a constant, but since the PyObject has already been created, it may return a PyLong when a PyInt is sufficient. This patch adds a check that will convert a PyLong object back into a PyInt if possible.
Logged In: YES user_id=33168
Thanks!
Unfortunately, this patch leaves the long in co_consts:
def foo(): ... x = -9223372036854775808 ... foo.func_code.co_consts (None, 9223372036854775808L, -9223372036854775808)
This is a 64-bit system. On 2.4, there is only sys.minint:
Python 2.4.2 (#1, Oct 30 2005, 21:35:48)
def foo(): ... x = -9223372036854775808 ... foo.func_code.co_consts (None, -9223372036854775808)
Can you revise the patch to fix this? I cleaned up some things. Attached is an updated version I was using.