From 6269fec171191a38e418dc6b94697ca4fe6e4160 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Thu, 1 Jan 2009 12:15:31 +0000 Subject: [PATCH] #4228: Pack negative values the same way as 2.4 in struct's L format. --- Lib/test/test_struct.py | 7 +++++++ Misc/NEWS | 2 ++ 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 232bffc275..7f5f08b4c6 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' diff --git a/Misc/NEWS b/Misc/NEWS index 7eab3ae08e..9639b1897f 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -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 30feaa6fb1..b8f1525f6c 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; } -- 2.50.1