diff options
author | Martin v. Löwis <martin@v.loewis.de> | 2006-10-04 05:47:34 (GMT) |
---|---|---|
committer | Martin v. Löwis <martin@v.loewis.de> | 2006-10-04 05:47:34 (GMT) |
commit | 820d6ac9d7c2743e6804914471159a1ca74cbd41 (patch) | |
tree | 9fd0052d3b6b9a183a029df061b67d569f820384 | |
parent | 82271f13e7eab69b909d538556e4781e971f7584 (diff) | |
download | cpython-820d6ac9d7c2743e6804914471159a1ca74cbd41.zip cpython-820d6ac9d7c2743e6804914471159a1ca74cbd41.tar.gz cpython-820d6ac9d7c2743e6804914471159a1ca74cbd41.tar.bz2 |
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.
-rw-r--r-- | Lib/test/test_builtin.py | 1 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Objects/intobject.c | 7 |
3 files changed, 7 insertions, 4 deletions
diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index ca7a8f3..f3bdbe2 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -116,6 +116,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) @@ -12,6 +12,9 @@ What's New in Python 2.6 alpha 1? 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 number of arguments, as was the case in Python 2.4. diff --git a/Objects/intobject.c b/Objects/intobject.c index cbca495..4e1f04f 100644 --- a/Objects/intobject.c +++ b/Objects/intobject.c @@ -754,10 +754,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); @@ -766,7 +765,7 @@ int_neg(PyIntObject *v) } return NULL; } - return PyInt_FromLong(x); + return PyInt_FromLong(-a); } static PyObject * |