Fix integer negation and absolute value to not rely

on undefined behaviour of the C compiler anymore.
Will backport to 2.5 and 2.4.
This commit is contained in:
Martin v. Löwis 2006-10-04 05:47:34 +00:00
parent 82271f13e7
commit 820d6ac9d7
3 changed files with 7 additions and 4 deletions

View File

@ -116,6 +116,7 @@ class BuiltinTest(unittest.TestCase):
self.assertEqual(abs(0), 0) self.assertEqual(abs(0), 0)
self.assertEqual(abs(1234), 1234) self.assertEqual(abs(1234), 1234)
self.assertEqual(abs(-1234), 1234) self.assertEqual(abs(-1234), 1234)
self.assertTrue(abs(-sys.maxint-1) > 0)
# float # float
self.assertEqual(abs(0.0), 0.0) self.assertEqual(abs(0.0), 0.0)
self.assertEqual(abs(3.14), 3.14) self.assertEqual(abs(3.14), 3.14)

View File

@ -12,6 +12,9 @@ What's New in Python 2.6 alpha 1?
Core and builtins Core and builtins
----------------- -----------------
- Integer negation and absolute value were fixed to not rely
on undefined behaviour of the C compiler anymore.
- Bug #1566800: make sure that EnvironmentError can be called with any - Bug #1566800: make sure that EnvironmentError can be called with any
number of arguments, as was the case in Python 2.4. number of arguments, as was the case in Python 2.4.

View File

@ -754,10 +754,9 @@ int_pow(PyIntObject *v, PyIntObject *w, PyIntObject *z)
static PyObject * static PyObject *
int_neg(PyIntObject *v) int_neg(PyIntObject *v)
{ {
register long a, x; register long a;
a = v->ob_ival; a = v->ob_ival;
x = -a; if (a < 0 && (unsigned long)a == 0-(unsigned long)a) {
if (a < 0 && x < 0) {
PyObject *o = PyLong_FromLong(a); PyObject *o = PyLong_FromLong(a);
if (o != NULL) { if (o != NULL) {
PyObject *result = PyNumber_Negative(o); PyObject *result = PyNumber_Negative(o);
@ -766,7 +765,7 @@ int_neg(PyIntObject *v)
} }
return NULL; return NULL;
} }
return PyInt_FromLong(x); return PyInt_FromLong(-a);
} }
static PyObject * static PyObject *