Index: Doc/library/struct.rst =================================================================== --- Doc/library/struct.rst (revision 70643) +++ Doc/library/struct.rst (working copy) @@ -134,6 +134,17 @@ specified number of bytes. As a special case, ``'0s'`` means a single, empty string (while ``'0c'`` means 0 characters). +When packing a value using one of the integer formats ( ``'b'``, +``'h'``, ``'i'``, ``'l'``, ``'q'``, ``'B'``, ``'H'``, ``'I'``, +``'L'``, ``'Q'``) if the value to be packed is outside the range of +valid values for that format then either :exc:`struct.error` or +:exc:`OverflowError` is raised. + +.. versionchanged:: 3.1 + In 3.0, some of the integer formats wrapped values and raised + :exc:`DeprecationWarning` instead of :exc:`OverflowError`. + + The ``'p'`` format character encodes a "Pascal string", meaning a short variable-length string stored in a fixed number of bytes. The count is the total number of bytes stored. The first byte stored is the length of the string, or Index: Lib/test/test_struct.py =================================================================== --- Lib/test/test_struct.py (revision 70643) +++ Lib/test/test_struct.py (working copy) @@ -14,10 +14,8 @@ try: import _struct except ImportError: - PY_STRUCT_RANGE_CHECKING = 0 PY_STRUCT_FLOAT_COERCE = 2 else: - PY_STRUCT_RANGE_CHECKING = getattr(_struct, '_PY_STRUCT_RANGE_CHECKING', 0) PY_STRUCT_FLOAT_COERCE = getattr(_struct, '_PY_STRUCT_FLOAT_COERCE', 0) def string_reverse(s): @@ -40,20 +38,6 @@ return func(*args, **kw) return decorator -@with_warning_restore -def deprecated_err(func, *args): - try: - func(*args) - except (struct.error, OverflowError): - pass - except DeprecationWarning: - raise TestFailed("%s%s expected to raise DeprecationWarning" % ( - func.__name__, args)) - else: - raise TestFailed("%s%s did not raise error" % ( - func.__name__, args)) - - class StructTest(unittest.TestCase): @with_warning_restore @@ -222,12 +206,6 @@ class IntTester(unittest.TestCase): - # XXX Most std integer modes fail to test for out-of-range. - # The "i" and "l" codes appear to range-check OK on 32-bit boxes, but - # fail to check correctly on some 64-bit ones (Tru64 Unix + Compaq C - # reported by Mark Favas). - BUGGY_RANGE_CHECK = "bBhHiIlL" - def __init__(self, formatpair, bytesize): self.assertEqual(len(formatpair), 2) self.formatpair = formatpair @@ -291,12 +269,10 @@ else: # x is out of range -- verify pack realizes that. - if not PY_STRUCT_RANGE_CHECKING and code in self.BUGGY_RANGE_CHECK: - if verbose: - print("Skipping buggy range check for code", code) - else: - deprecated_err(pack, ">" + code, x) - deprecated_err(pack, "<" + code, x) + self.assertRaises((struct.error, OverflowError), + pack, ">" + code, x) + self.assertRaises((struct.error, OverflowError), + pack, "<" + code, x) # Much the same for unsigned. code = self.unsigned_code @@ -340,12 +316,10 @@ else: # x is out of range -- verify pack realizes that. - if not PY_STRUCT_RANGE_CHECKING and code in self.BUGGY_RANGE_CHECK: - if verbose: - print("Skipping buggy range check for code", code) - else: - deprecated_err(pack, ">" + code, x) - deprecated_err(pack, "<" + code, x) + self.assertRaises((struct.error, OverflowError), + pack, ">" + code, x) + self.assertRaises((struct.error, OverflowError), + pack, "<" + code, x) def run(self): from random import randrange @@ -443,20 +417,24 @@ big = math.ldexp(big, 127 - 24) self.assertRaises(OverflowError, struct.pack, ">f", big) - if PY_STRUCT_RANGE_CHECKING: - def test_1229380(self): - # SF bug 1229380. No struct.pack exception for some out of - # range integers - import sys - for endian in ('', '>', '<'): - for fmt in ('B', 'H', 'I', 'L'): - deprecated_err(struct.pack, endian + fmt, -1) + def test_1229380(self): + # SF bug 1229380. No struct.pack exception for some out of + # range integers + import sys + for endian in ('', '>', '<'): + for fmt in ('B', 'H', 'I', 'L'): + self.assertRaises((struct.error, OverflowError), struct.pack, + endian + fmt, -1) - deprecated_err(struct.pack, endian + 'B', 300) - deprecated_err(struct.pack, endian + 'H', 70000) + self.assertRaises((struct.error, OverflowError), struct.pack, + endian + 'B', 300) + self.assertRaises((struct.error, OverflowError), struct.pack, + endian + 'H', 70000) - deprecated_err(struct.pack, endian + 'I', sys.maxsize * 4) - deprecated_err(struct.pack, endian + 'L', sys.maxsize * 4) + self.assertRaises((struct.error, OverflowError), struct.pack, + endian + 'I', sys.maxsize * 4) + self.assertRaises((struct.error, OverflowError), struct.pack, + endian + 'L', sys.maxsize * 4) def XXXtest_1530559(self): # XXX This is broken: see the bug report Index: Modules/_struct.c =================================================================== --- Modules/_struct.c (revision 70643) +++ Modules/_struct.c (working copy) @@ -2028,7 +2028,6 @@ PyModule_AddObject(m, "__version__", ver); - PyModule_AddIntConstant(m, "_PY_STRUCT_RANGE_CHECKING", 1); #ifdef PY_STRUCT_FLOAT_COERCE PyModule_AddIntConstant(m, "_PY_STRUCT_FLOAT_COERCE", 1); #endif