From: Martin v. Löwis Date: Wed, 4 Oct 2006 05:48:05 +0000 (+0000) Subject: Fix integer negation and absolute value to not rely X-Git-Tag: v2.4.4c1~56 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=98041d7bf034fec109fb24a88fcf7b70fdade899;p=thirdparty%2FPython%2Fcpython.git Fix integer negation and absolute value to not rely on undefined behaviour of the C compiler anymore. --- diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index 2389e1be52ea..f8a5047113b9 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -101,6 +101,7 @@ class BuiltinTest(unittest.TestCase): self.assertEqual(abs(0), 0) self.assertEqual(abs(1234), 1234) self.assertEqual(abs(-1234), 1234) + self.assertTrue(abs(-sys.maxint-1) > 0) # float self.assertEqual(abs(0.0), 0.0) self.assertEqual(abs(3.14), 3.14) diff --git a/Misc/NEWS b/Misc/NEWS index 2a6145c72c0c..e505a3210969 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,9 @@ What's New in Python 2.4.4c1? Core and builtins ----------------- +- Integer negation and absolute value were fixed to not rely + on undefined behaviour of the C compiler anymore. + - Patch #1567691: super() and new.instancemethod() now don't accept keyword arguments any more (previously they accepted them, but didn't use them). diff --git a/Objects/intobject.c b/Objects/intobject.c index 1a7e2f7c8610..579fe7dcbfc1 100644 --- a/Objects/intobject.c +++ b/Objects/intobject.c @@ -674,10 +674,9 @@ int_pow(PyIntObject *v, PyIntObject *w, PyIntObject *z) static PyObject * int_neg(PyIntObject *v) { - register long a, x; + register long a; a = v->ob_ival; - x = -a; - if (a < 0 && x < 0) { + if (a < 0 && (unsigned long)a == 0-(unsigned long)a) { PyObject *o = PyLong_FromLong(a); if (o != NULL) { PyObject *result = PyNumber_Negative(o); @@ -686,7 +685,7 @@ int_neg(PyIntObject *v) } return NULL; } - return PyInt_FromLong(x); + return PyInt_FromLong(-a); } static PyObject *