[Python-checkins] r61383 - in python/trunk: Lib/test/test_struct.py Misc/NEWS Objects/floatobject.c

mark.dickinson python-checkins at python.org
Fri Mar 14 15:23:38 CET 2008


Author: mark.dickinson
Date: Fri Mar 14 15:23:37 2008
New Revision: 61383

Modified:
   python/trunk/Lib/test/test_struct.py
   python/trunk/Misc/NEWS
   python/trunk/Objects/floatobject.c
Log:
Issue 705836: Fix struct.pack(">f", 1e40) to behave consistently
across platforms:  it should now raise OverflowError on all
platforms.  (Previously it raised OverflowError only on
non IEEE 754 platforms.)

Also fix the (already existing) test for this behaviour
so that it actually raises TestFailed instead of just
referencing it.


Modified: python/trunk/Lib/test/test_struct.py
==============================================================================
--- python/trunk/Lib/test/test_struct.py	(original)
+++ python/trunk/Lib/test/test_struct.py	Fri Mar 14 15:23:37 2008
@@ -482,7 +482,7 @@
     except OverflowError:
         pass
     else:
-        TestFailed("expected OverflowError")
+        raise TestFailed("expected OverflowError")
 
 test_705836()
 

Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Fri Mar 14 15:23:37 2008
@@ -21,6 +21,10 @@
 Library
 -------
 
+- Issue #705836: struct.pack(">f", x) now raises OverflowError on all
+  platforms when x is too large to fit into an IEEE 754 float; previously
+  it only raised OverflowError on non IEEE 754 platforms.
+
 - Issue #1106316: pdb.post_mortem()'s parameter, "traceback", is now
   optional: it defaults to the traceback of the exception that is currently
   being handled (is mandatory to be in the middle of an exception, otherwise

Modified: python/trunk/Objects/floatobject.c
==============================================================================
--- python/trunk/Objects/floatobject.c	(original)
+++ python/trunk/Objects/floatobject.c	Fri Mar 14 15:23:37 2008
@@ -1751,9 +1751,6 @@
 
 /*----------------------------------------------------------------------------
  * _PyFloat_{Pack,Unpack}{4,8}.  See floatobject.h.
- *
- * TODO:  On platforms that use the standard IEEE-754 single and double
- * formats natively, these routines could simply copy the bytes.
  */
 int
 _PyFloat_Pack4(double x, unsigned char *p, int le)
@@ -1833,28 +1830,31 @@
 		/* Done */
 		return 0;
 
-	  Overflow:
-		PyErr_SetString(PyExc_OverflowError,
-				"float too large to pack with f format");
-		return -1;
 	}
 	else {
 		float y = (float)x;
 		const char *s = (char*)&y;
 		int i, incr = 1;
 
+		if (Py_IS_INFINITY(y) && !Py_IS_INFINITY(x))
+			goto Overflow;
+
 		if ((float_format == ieee_little_endian_format && !le)
 		    || (float_format == ieee_big_endian_format && le)) {
 			p += 3;
 			incr = -1;
 		}
-		
+
 		for (i = 0; i < 4; i++) {
 			*p = *s++;
 			p += incr;
 		}
 		return 0;
 	}
+  Overflow:
+	PyErr_SetString(PyExc_OverflowError,
+			"float too large to pack with f format");
+	return -1;
 }
 
 int


More information about the Python-checkins mailing list