diff options
author | Georg Brandl <georg@python.org> | 2009-01-01 12:15:31 (GMT) |
---|---|---|
committer | Georg Brandl <georg@python.org> | 2009-01-01 12:15:31 (GMT) |
commit | 6269fec171191a38e418dc6b94697ca4fe6e4160 (patch) | |
tree | 9f3999fff773c450ef8a3873069e22cc4a69381a | |
parent | 775c30706882291fe6385066899f702f768ed95f (diff) | |
download | cpython-6269fec171191a38e418dc6b94697ca4fe6e4160.zip cpython-6269fec171191a38e418dc6b94697ca4fe6e4160.tar.gz cpython-6269fec171191a38e418dc6b94697ca4fe6e4160.tar.bz2 |
#4228: Pack negative values the same way as 2.4
in struct's L format.
-rw-r--r-- | Lib/test/test_struct.py | 7 | ||||
-rw-r--r-- | Misc/NEWS | 2 | ||||
-rw-r--r-- | Modules/_struct.c | 12 |
3 files changed, 15 insertions, 6 deletions
diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py index 232bffc..7f5f08b 100644 --- a/Lib/test/test_struct.py +++ b/Lib/test/test_struct.py @@ -2,6 +2,8 @@ import array import unittest import struct import warnings +warnings.filterwarnings("ignore", "struct integer overflow masking is deprecated", + DeprecationWarning) from functools import wraps from test.test_support import TestFailed, verbose, run_unittest @@ -461,6 +463,11 @@ class StructTest(unittest.TestCase): self.check_float_coerce(endian + fmt, 1.0) self.check_float_coerce(endian + fmt, 1.5) + def test_issue4228(self): + # Packing a long may yield either 32 or 64 bits + x = struct.pack('L', -1)[:4] + self.assertEqual(x, '\xff'*4) + def test_unpack_from(self): test_string = 'abcd01234' fmt = '4s' @@ -258,6 +258,8 @@ C-API Extension Modules ----------------- +- Issue #4228: Pack negative values the same way as 2.4 in struct's L format. + - Issue #1040026: Fix os.times result on systems where HZ is incorrect. - Issues #3167, #3682: Fix test_math failures for log, log10 on Solaris, diff --git a/Modules/_struct.c b/Modules/_struct.c index 30feaa6..b8f1525 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -663,7 +663,7 @@ np_int(char *p, PyObject *v, const formatdef *f) return -1; #if (SIZEOF_LONG > SIZEOF_INT) if ((x < ((long)INT_MIN)) || (x > ((long)INT_MAX))) - return _range_error(f, 0); + RANGE_ERROR(x, f, 0, -1); #endif y = (int)x; memcpy(p, (char *)&y, sizeof y); @@ -675,12 +675,12 @@ np_uint(char *p, PyObject *v, const formatdef *f) { unsigned long x; unsigned int y; - if (get_ulong(v, &x) < 0) - return _range_error(f, 1); + if (get_wrapped_ulong(v, &x) < 0) + return -1; y = (unsigned int)x; #if (SIZEOF_LONG > SIZEOF_INT) if (x > ((unsigned long)UINT_MAX)) - return _range_error(f, 1); + RANGE_ERROR(y, f, 1, -1); #endif memcpy(p, (char *)&y, sizeof y); return 0; @@ -700,8 +700,8 @@ static int np_ulong(char *p, PyObject *v, const formatdef *f) { unsigned long x; - if (get_ulong(v, &x) < 0) - return _range_error(f, 1); + if (get_wrapped_ulong(v, &x) < 0) + return -1; memcpy(p, (char *)&x, sizeof x); return 0; } |