diff options
-rw-r--r-- | Lib/test/test_struct.py | 2 | ||||
-rw-r--r-- | Misc/NEWS | 4 | ||||
-rw-r--r-- | Objects/floatobject.c | 16 |
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() @@ -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 |