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.