Fix integer negation and absolute value to not rely

on undefined behaviour of the C compiler anymore.
This commit is contained in:
Martin v. Löwis 2006-10-04 05:47:47 +00:00
parent a027bac30a
commit 10525ad313
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.5.1c1?
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

@ -760,10 +760,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);
@ -772,7 +771,7 @@ int_neg(PyIntObject *v)
} }
return NULL; return NULL;
} }
return PyInt_FromLong(x); return PyInt_FromLong(-a);
} }
static PyObject * static PyObject *