Issue #15480: Remove the deprecated and unused TYPE_INT64 code from marshal.
Initial patch by Daniel Riti.
This commit is contained in:
parent
e2cef885a2
commit
e9bbe8b87b
|
@ -23,36 +23,12 @@ class HelperMixin:
|
||||||
|
|
||||||
class IntTestCase(unittest.TestCase, HelperMixin):
|
class IntTestCase(unittest.TestCase, HelperMixin):
|
||||||
def test_ints(self):
|
def test_ints(self):
|
||||||
# Test the full range of Python ints.
|
# Test a range of Python ints larger than the machine word size.
|
||||||
n = sys.maxsize
|
n = sys.maxsize ** 2
|
||||||
while n:
|
while n:
|
||||||
for expected in (-n, n):
|
for expected in (-n, n):
|
||||||
self.helper(expected)
|
self.helper(expected)
|
||||||
n = n >> 1
|
n = n >> 1
|
||||||
|
|
||||||
def test_int64(self):
|
|
||||||
# Simulate int marshaling on a 64-bit box. This is most interesting if
|
|
||||||
# we're running the test on a 32-bit box, of course.
|
|
||||||
|
|
||||||
def to_little_endian_string(value, nbytes):
|
|
||||||
b = bytearray()
|
|
||||||
for i in range(nbytes):
|
|
||||||
b.append(value & 0xff)
|
|
||||||
value >>= 8
|
|
||||||
return b
|
|
||||||
|
|
||||||
maxint64 = (1 << 63) - 1
|
|
||||||
minint64 = -maxint64-1
|
|
||||||
|
|
||||||
for base in maxint64, minint64, -maxint64, -(minint64 >> 1):
|
|
||||||
while base:
|
|
||||||
s = b'I' + to_little_endian_string(base, 8)
|
|
||||||
got = marshal.loads(s)
|
|
||||||
self.assertEqual(base, got)
|
|
||||||
if base == -1: # a fixed-point for shifting right 1
|
|
||||||
base = 0
|
|
||||||
else:
|
|
||||||
base >>= 1
|
|
||||||
|
|
||||||
def test_bool(self):
|
def test_bool(self):
|
||||||
for b in (True, False):
|
for b in (True, False):
|
||||||
|
|
|
@ -1024,6 +1024,7 @@ Nicholas Riley
|
||||||
Jean-Claude Rimbault
|
Jean-Claude Rimbault
|
||||||
Vlad Riscutia
|
Vlad Riscutia
|
||||||
Wes Rishel
|
Wes Rishel
|
||||||
|
Daniel Riti
|
||||||
Juan M. Bello Rivas
|
Juan M. Bello Rivas
|
||||||
Davide Rizzo
|
Davide Rizzo
|
||||||
Anthony Roach
|
Anthony Roach
|
||||||
|
|
|
@ -44,6 +44,9 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #15480: Remove the deprecated and unused TYPE_INT64 code from marshal.
|
||||||
|
Initial patch by Daniel Riti.
|
||||||
|
|
||||||
- Issue #2118: SMTPException is now a subclass of IOError.
|
- Issue #2118: SMTPException is now a subclass of IOError.
|
||||||
|
|
||||||
- Issue #17016: Get rid of possible pointer wraparounds and integer overflows
|
- Issue #17016: Get rid of possible pointer wraparounds and integer overflows
|
||||||
|
|
|
@ -33,10 +33,6 @@
|
||||||
#define TYPE_STOPITER 'S'
|
#define TYPE_STOPITER 'S'
|
||||||
#define TYPE_ELLIPSIS '.'
|
#define TYPE_ELLIPSIS '.'
|
||||||
#define TYPE_INT 'i'
|
#define TYPE_INT 'i'
|
||||||
/* TYPE_INT64 is deprecated. It is not
|
|
||||||
generated anymore, and support for reading it
|
|
||||||
will be removed in Python 3.4. */
|
|
||||||
#define TYPE_INT64 'I'
|
|
||||||
#define TYPE_FLOAT 'f'
|
#define TYPE_FLOAT 'f'
|
||||||
#define TYPE_BINARY_FLOAT 'g'
|
#define TYPE_BINARY_FLOAT 'g'
|
||||||
#define TYPE_COMPLEX 'x'
|
#define TYPE_COMPLEX 'x'
|
||||||
|
@ -638,42 +634,6 @@ r_long(RFILE *p)
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* r_long64 deals with the TYPE_INT64 code. On a machine with
|
|
||||||
sizeof(long) > 4, it returns a Python int object, else a Python long
|
|
||||||
object. Note that w_long64 writes out TYPE_INT if 32 bits is enough,
|
|
||||||
so there's no inefficiency here in returning a PyLong on 32-bit boxes
|
|
||||||
for everything written via TYPE_INT64 (i.e., if an int is written via
|
|
||||||
TYPE_INT64, it *needs* more than 32 bits).
|
|
||||||
*/
|
|
||||||
static PyObject *
|
|
||||||
r_long64(RFILE *p)
|
|
||||||
{
|
|
||||||
PyObject *result = NULL;
|
|
||||||
long lo4 = r_long(p);
|
|
||||||
long hi4 = r_long(p);
|
|
||||||
|
|
||||||
if (!PyErr_Occurred()) {
|
|
||||||
#if SIZEOF_LONG > 4
|
|
||||||
long x = (hi4 << 32) | (lo4 & 0xFFFFFFFFL);
|
|
||||||
result = PyLong_FromLong(x);
|
|
||||||
#else
|
|
||||||
unsigned char buf[8];
|
|
||||||
int one = 1;
|
|
||||||
int is_little_endian = (int)*(char*)&one;
|
|
||||||
if (is_little_endian) {
|
|
||||||
memcpy(buf, &lo4, 4);
|
|
||||||
memcpy(buf+4, &hi4, 4);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
memcpy(buf, &hi4, 4);
|
|
||||||
memcpy(buf+4, &lo4, 4);
|
|
||||||
}
|
|
||||||
result = _PyLong_FromByteArray(buf, 8, is_little_endian, 1);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
r_PyLong(RFILE *p)
|
r_PyLong(RFILE *p)
|
||||||
{
|
{
|
||||||
|
@ -871,11 +831,6 @@ r_object(RFILE *p)
|
||||||
R_REF(retval);
|
R_REF(retval);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TYPE_INT64:
|
|
||||||
retval = r_long64(p);
|
|
||||||
R_REF(retval);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TYPE_LONG:
|
case TYPE_LONG:
|
||||||
retval = r_PyLong(p);
|
retval = r_PyLong(p);
|
||||||
R_REF(retval);
|
R_REF(retval);
|
||||||
|
@ -1201,7 +1156,7 @@ r_object(RFILE *p)
|
||||||
PyObject *name = NULL;
|
PyObject *name = NULL;
|
||||||
int firstlineno;
|
int firstlineno;
|
||||||
PyObject *lnotab = NULL;
|
PyObject *lnotab = NULL;
|
||||||
|
|
||||||
idx = r_ref_reserve(flag, p);
|
idx = r_ref_reserve(flag, p);
|
||||||
if (idx < 0) {
|
if (idx < 0) {
|
||||||
retval = NULL;
|
retval = NULL;
|
||||||
|
|
Loading…
Reference in New Issue