diff options
author | Alexander Belopolsky <alexander.belopolsky@gmail.com> | 2010-07-17 22:50:45 (GMT) |
---|---|---|
committer | Alexander Belopolsky <alexander.belopolsky@gmail.com> | 2010-07-17 22:50:45 (GMT) |
commit | d92f04062a8cb3c01ac44f67f7bde8a11b285457 (patch) | |
tree | 2259b2ace42de43b616f624a07de20dd2d2dbf6c /Lib/pickle.py | |
parent | bbda0c5fbc757a2751263720dc6a255f517e5261 (diff) | |
download | cpython-d92f04062a8cb3c01ac44f67f7bde8a11b285457.zip cpython-d92f04062a8cb3c01ac44f67f7bde8a11b285457.tar.gz cpython-d92f04062a8cb3c01ac44f67f7bde8a11b285457.tar.bz2 |
Issue #5180: Fixed a bug that prevented loading 2.x pickles in 3.x
python when they contain instances of old-style classes.
Diffstat (limited to 'Lib/pickle.py')
-rw-r--r-- | Lib/pickle.py | 21 |
1 files changed, 5 insertions, 16 deletions
diff --git a/Lib/pickle.py b/Lib/pickle.py index c4fc2c4..372d5b6 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -1034,19 +1034,15 @@ class _Unpickler: def _instantiate(self, klass, k): args = tuple(self.stack[k+1:]) del self.stack[k:] - instantiated = False - if (not args and - isinstance(klass, type) and - not hasattr(klass, "__getinitargs__")): - value = _EmptyClass() - value.__class__ = klass - instantiated = True - if not instantiated: + if (args or not isinstance(klass, type) or + hasattr(klass, "__getinitargs__")): try: value = klass(*args) except TypeError as err: raise TypeError("in constructor for %s: %s" % (klass.__name__, str(err)), sys.exc_info()[2]) + else: + value = klass.__new__(klass) self.append(value) def load_inst(self): @@ -1239,14 +1235,7 @@ class _Unpickler: raise _Stop(value) dispatch[STOP[0]] = load_stop -# Helper class for load_inst/load_obj - -class _EmptyClass: - pass - -# Encode/decode longs in linear time. - -import binascii as _binascii +# Encode/decode longs. def encode_long(x): r"""Encode a long to a two's complement little-endian binary string. |