summaryrefslogtreecommitdiffstats
path: root/Lib/pickle.py
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1997-09-03 00:23:54 (GMT)
committerGuido van Rossum <guido@python.org>1997-09-03 00:23:54 (GMT)
commit5ed5c4c364930ae597df2038b4569d8f06b98f75 (patch)
treeec7df44fd983935025d83a5a31a6bc61dfb70564 /Lib/pickle.py
parent15a40394b0c21829ba9afbb739b2038b8211dabe (diff)
downloadcpython-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.
Diffstat (limited to 'Lib/pickle.py')
-rw-r--r--Lib/pickle.py19
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):