summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_struct.py2
-rw-r--r--Misc/NEWS4
-rw-r--r--Objects/floatobject.c16
3 files changed, 13 insertions, 9 deletions
diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py
index d226115..3ede005 100644
--- a/Lib/test/test_struct.py
+++ b/Lib/test/test_struct.py
@@ -482,7 +482,7 @@ def test_705836():
except OverflowError:
pass
else:
- TestFailed("expected OverflowError")
+ raise TestFailed("expected OverflowError")
test_705836()
diff --git a/Misc/NEWS b/Misc/NEWS
index 65ce4c0..3397f0c 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -21,6 +21,10 @@ Core and builtins
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
diff --git a/Objects/floatobject.c b/Objects/floatobject.c
index 392a037..0eaca0f 100644
--- a/Objects/floatobject.c
+++ b/Objects/floatobject.c
@@ -1751,9 +1751,6 @@ PyFloat_Fini(void)
/*----------------------------------------------------------------------------
* _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 @@ _PyFloat_Pack4(double x, unsigned char *p, int le)
/* 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