From 5ed5c4c364930ae597df2038b4569d8f06b98f75 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Wed, 3 Sep 1997 00:23:54 +0000 Subject: [PATCH] Add the same _keep_alive patch (by Michael Scharff) that was added to copy.deepcopy() a while ago. Can't reproduce this but it doesn't break anything and it looks like the code could have the same problem. --- Lib/pickle.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Lib/pickle.py b/Lib/pickle.py index bc01c905a4c..97eb4e45bc8 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):