diff options
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/pickle.py | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/Lib/pickle.py b/Lib/pickle.py index bc01c90..97eb4e4 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -473,6 +473,7 @@ class Pickler: if hasattr(object, '__getinitargs__'): args = object.__getinitargs__() len(args) # XXX Assert it's a sequence + _keep_alive(args, memo) else: args = () @@ -501,6 +502,7 @@ class Pickler: stuff = object.__dict__ else: stuff = getstate() + _keep_alive(stuff, memo) save(stuff) write(BUILD) dispatch[InstanceType] = save_inst @@ -523,6 +525,23 @@ class Pickler: dispatch[BuiltinFunctionType] = save_global +def _keep_alive(x, memo): + """Keeps a reference to the object x in the memo. + + Because we remember objects by their id, we have + to assure that possibly temporary objects are kept + alive by referencing them. + We store a reference at the id of the memo, which should + normally not be used unless someone tries to deepcopy + the memo itself... + """ + try: + memo[id(memo)].append(x) + except KeyError: + # aha, this is the first one :-) + memo[id(memo)]=[x] + + classmap = {} def whichmodule(cls, clsname): |