mirror of
https://github.com/python/cpython.git
synced 2025-07-29 14:15:07 +00:00
Issue #1727780: Support loading pickles of random.Random objects created
on 32-bit systems on 64-bit systems, and vice versa. As a consequence of the change, Random pickles created by Python 2.6 cannot be loaded in Python 2.5.
This commit is contained in:
parent
2ec7415db5
commit
6b449f4f2b
10 changed files with 1944 additions and 10 deletions
|
@ -83,7 +83,7 @@ class Random(_random.Random):
|
|||
|
||||
"""
|
||||
|
||||
VERSION = 2 # used by getstate/setstate
|
||||
VERSION = 3 # used by getstate/setstate
|
||||
|
||||
def __init__(self, x=None):
|
||||
"""Initialize an instance.
|
||||
|
@ -120,9 +120,20 @@ class Random(_random.Random):
|
|||
def setstate(self, state):
|
||||
"""Restore internal state from object returned by getstate()."""
|
||||
version = state[0]
|
||||
if version == 2:
|
||||
if version == 3:
|
||||
version, internalstate, self.gauss_next = state
|
||||
super(Random, self).setstate(internalstate)
|
||||
elif version == 2:
|
||||
version, internalstate, self.gauss_next = state
|
||||
# In version 2, the state was saved as signed ints, which causes
|
||||
# inconsistencies between 32/64-bit systems. The state is
|
||||
# really unsigned 32-bit ints, so we convert negative ints from
|
||||
# version 2 to positive longs for version 3.
|
||||
try:
|
||||
internalstate = tuple( long(x) % (2**32) for x in internalstate )
|
||||
except ValueError, e:
|
||||
raise TypeError, e
|
||||
super(Random, self).setstate(internalstate)
|
||||
else:
|
||||
raise ValueError("state with version %s passed to "
|
||||
"Random.setstate() of version %s" %
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue