mirror of
https://github.com/python/cpython.git
synced 2025-08-31 05:58:33 +00:00
cPickle support for TUPLE[123]. Incidentally plugged several undetected
overflow holes in Pdata_grow().
This commit is contained in:
parent
9af6968b90
commit
1d63c9f151
3 changed files with 250 additions and 91 deletions
|
@ -484,6 +484,27 @@ class AbstractPickleTests(unittest.TestCase):
|
|||
self.assertEqual(x, y)
|
||||
|
||||
def test_short_tuples(self):
|
||||
# Map (proto, len(tuple)) to expected opcode.
|
||||
expected_opcode = {(0, 0): pickle.TUPLE,
|
||||
(0, 1): pickle.TUPLE,
|
||||
(0, 2): pickle.TUPLE,
|
||||
(0, 3): pickle.TUPLE,
|
||||
(0, 4): pickle.TUPLE,
|
||||
|
||||
(1, 0): pickle.EMPTY_TUPLE,
|
||||
(1, 1): pickle.TUPLE,
|
||||
(1, 2): pickle.TUPLE,
|
||||
(1, 3): pickle.TUPLE,
|
||||
(1, 4): pickle.TUPLE,
|
||||
|
||||
(2, 0): pickle.EMPTY_TUPLE,
|
||||
(2, 1): pickle.TUPLE1,
|
||||
(2, 2): pickle.TUPLE2,
|
||||
(2, 3): pickle.TUPLE3,
|
||||
(2, 4): pickle.TUPLE,
|
||||
}
|
||||
all_tuple_opcodes = (pickle.TUPLE, pickle.EMPTY_TUPLE,
|
||||
pickle.TUPLE1, pickle.TUPLE2, pickle.TUPLE3)
|
||||
a = ()
|
||||
b = (1,)
|
||||
c = (1, 2)
|
||||
|
@ -495,6 +516,16 @@ class AbstractPickleTests(unittest.TestCase):
|
|||
y = self.loads(s)
|
||||
self.assertEqual(x, y, (proto, x, s, y))
|
||||
|
||||
# Verify that the protocol-correct tuple-building opcode
|
||||
# was generated.
|
||||
expected = expected_opcode[proto, len(x)]
|
||||
for opcode in s:
|
||||
if opcode in all_tuple_opcodes:
|
||||
self.assertEqual(expected, opcode)
|
||||
break
|
||||
else:
|
||||
self.fail("didn't find a tuple-building opcode in pickle")
|
||||
|
||||
def test_singletons(self):
|
||||
for proto in protocols:
|
||||
for x in None, False, True:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue