Kaydet (Commit) 98041d7b authored tarafından Martin v. Löwis's avatar Martin v. Löwis

Fix integer negation and absolute value to not rely

on undefined behaviour of the C compiler anymore.
üst e346a732
......@@ -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)
......
......@@ -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).
......
......@@ -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 *
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment