diff options
author | Guido van Rossum <guido@python.org> | 1997-09-03 00:23:54 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1997-09-03 00:23:54 (GMT) |
commit | 5ed5c4c364930ae597df2038b4569d8f06b98f75 (patch) | |
tree | ec7df44fd983935025d83a5a31a6bc61dfb70564 | |
parent | 15a40394b0c21829ba9afbb739b2038b8211dabe (diff) | |
download | cpython-5ed5c4c364930ae597df2038b4569d8f06b98f75.zip cpython-5ed5c4c364930ae597df2038b4569d8f06b98f75.tar.gz cpython-5ed5c4c364930ae597df2038b4569d8f06b98f75.tar.bz2 |
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.
-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): |