[Python-checkins] r52132 - in python/branches/release24-maint: Lib/test/test_builtin.py Misc/NEWS Objects/intobject.c
martin.v.loewis
python-checkins at python.org
Wed Oct 4 07:48:06 CEST 2006
Author: martin.v.loewis
Date: Wed Oct 4 07:48:05 2006
New Revision: 52132
Modified:
python/branches/release24-maint/Lib/test/test_builtin.py
python/branches/release24-maint/Misc/NEWS
python/branches/release24-maint/Objects/intobject.c
Log:
Fix integer negation and absolute value to not rely
on undefined behaviour of the C compiler anymore.
Modified: python/branches/release24-maint/Lib/test/test_builtin.py
==============================================================================
--- python/branches/release24-maint/Lib/test/test_builtin.py (original)
+++ python/branches/release24-maint/Lib/test/test_builtin.py Wed Oct 4 07:48:05 2006
@@ -101,6 +101,7 @@
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)
Modified: python/branches/release24-maint/Misc/NEWS
==============================================================================
--- python/branches/release24-maint/Misc/NEWS (original)
+++ python/branches/release24-maint/Misc/NEWS Wed Oct 4 07:48:05 2006
@@ -12,6 +12,9 @@
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).
Modified: python/branches/release24-maint/Objects/intobject.c
==============================================================================
--- python/branches/release24-maint/Objects/intobject.c (original)
+++ python/branches/release24-maint/Objects/intobject.c Wed Oct 4 07:48:05 2006
@@ -674,10 +674,9 @@
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 @@
}
return NULL;
}
- return PyInt_FromLong(x);
+ return PyInt_FromLong(-a);
}
static PyObject *
More information about the Python-checkins
mailing list