From: Guido van Rossum Date: Wed, 3 Sep 1997 00:23:54 +0000 (+0000) Subject: Add the same _keep_alive patch (by Michael Scharff) that was added to X-Git-Tag: v1.5a4~256 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5ed5c4c364930ae597df2038b4569d8f06b98f75;p=python 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. --- diff --git a/Lib/pickle.py b/Lib/pickle.py index bc01c905a4..97eb4e45bc 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):