From 25bf7aea336336109f46fd94f640f2ba48621417 Mon Sep 17 00:00:00 2001 From: William Deegan Date: Sun, 10 Sep 2017 20:54:12 -0700 Subject: PY2/3 changes to pickle so py2.7 and py3.5+ pickles used in sconsign will be readable by either. There are still rebuilds when switching --- src/engine/SCons/compat/__init__.py | 4 +++- src/engine/SCons/dblite.py | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/engine/SCons/compat/__init__.py b/src/engine/SCons/compat/__init__.py index 59a1a94..0b6c016 100644 --- a/src/engine/SCons/compat/__init__.py +++ b/src/engine/SCons/compat/__init__.py @@ -96,7 +96,9 @@ rename_module('pickle', 'cPickle') # Negative numbers choose the highest available protocol. import pickle -PICKLE_PROTOCOL = pickle.HIGHEST_PROTOCOL +# Was pickle.HIGHEST_PROTOCOL +# Changed to 2 so py3.5+'s pickle will be compatible with py2.7. +PICKLE_PROTOCOL = 2 # TODO: FIXME # In 3.x, 'profile' automatically loads the fast version if available. diff --git a/src/engine/SCons/dblite.py b/src/engine/SCons/dblite.py index a9b9589..87a1763 100644 --- a/src/engine/SCons/dblite.py +++ b/src/engine/SCons/dblite.py @@ -119,7 +119,10 @@ class dblite(object): p = f.read() if len(p) > 0: try: - self._dict = pickle.loads(p) + if bytes is not str: + self._dict = pickle.loads(p, encoding='bytes') + else: + self._dict = pickle.loads(p) except (pickle.UnpicklingError, EOFError, KeyError): # Note how we catch KeyErrors too here, which might happen # when we don't have cPickle available (default pickle -- cgit v0.12