[Python-checkins] r51711 - in python/branches/release25-maint: Misc/NEWS Objects/intobject.c

tim.peters python-checkins at python.org
Tue Sep 5 03:47:54 CEST 2006


Author: tim.peters
Date: Tue Sep  5 03:47:53 2006
New Revision: 51711

Modified:
   python/branches/release25-maint/Misc/NEWS
   python/branches/release25-maint/Objects/intobject.c
Log:
i_divmod():  As discussed on Python-Dev, changed the overflow
checking to live happily with recent gcc optimizations that
assume signed integer arithmetic never overflows.


Modified: python/branches/release25-maint/Misc/NEWS
==============================================================================
--- python/branches/release25-maint/Misc/NEWS	(original)
+++ python/branches/release25-maint/Misc/NEWS	Tue Sep  5 03:47:53 2006
@@ -12,6 +12,9 @@
 Core and builtins
 -----------------
 
+- Overflow checking code in integer division ran afoul of new gcc
+  optimizations.  Changed to be more standard-conforming.
+
 - Patch #1541585: fix buffer overrun when performing repr() on
   a unicode string in a build with wide unicode (UCS-4) support.
 
@@ -127,7 +130,7 @@
 - The __repr__ method of a NULL ctypes.py_object() no longer raises
   an exception.
 
-- uuid.UUID now has a bytes_le attribute. This returns the UUID in 
+- uuid.UUID now has a bytes_le attribute. This returns the UUID in
   little-endian byte order for Windows. In addition, uuid.py gained some
   workarounds for clocks with low resolution, to stop the code yielding
   duplicate UUIDs.
@@ -286,7 +289,7 @@
 - Bug #1002398: The documentation for os.path.sameopenfile now correctly
   refers to file descriptors, not file objects.
 
-- The renaming of the xml package to xmlcore, and the import hackery done 
+- The renaming of the xml package to xmlcore, and the import hackery done
   to make it appear at both names, has been removed.  Bug #1511497,
   #1513611, and probably others.
 

Modified: python/branches/release25-maint/Objects/intobject.c
==============================================================================
--- python/branches/release25-maint/Objects/intobject.c	(original)
+++ python/branches/release25-maint/Objects/intobject.c	Tue Sep  5 03:47:53 2006
@@ -564,8 +564,14 @@
 				"integer division or modulo by zero");
 		return DIVMOD_ERROR;
 	}
-	/* (-sys.maxint-1)/-1 is the only overflow case. */
-	if (y == -1 && x < 0 && x == -x)
+	/* (-sys.maxint-1)/-1 is the only overflow case.  x is the most
+	 * negative long iff x < 0 and, on a 2's-complement box, x == -x.
+	 * However, -x is undefined (by C) if x /is/ the most negative long
+	 * (it's a signed overflow case), and some compilers care.  So we cast
+	 * x to unsigned long first.  However, then other compilers warn about
+	 * applying unary minus to an unsigned operand.  Hence the weird "0-".
+	 */
+	if (y == -1 && x < 0 && (unsigned long)x == 0-(unsigned long)x)
 		return DIVMOD_OVERFLOW;
 	xdivy = x / y;
 	xmody = x - xdivy * y;


More information about the Python-checkins mailing list