From: Mark Dickinson Date: Fri, 14 Mar 2008 14:23:37 +0000 (+0000) Subject: Issue 705836: Fix struct.pack(">f", 1e40) to behave consistently X-Git-Tag: v2.6a2~326 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c23b8a7af9b1548b645a79c5ea37a3ba780750ab;p=python 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. --- diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py index d226115527..3ede005c7a 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 65ce4c0b93..3397f0c443 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 392a037609..0eaca0f7be 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