From 5ed5c4c364930ae597df2038b4569d8f06b98f75 Mon Sep 17 00:00:00 2001
From: Guido van Rossum <guido@python.org>
Date: Wed, 3 Sep 1997 00:23:54 +0000
Subject: 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 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):
-- 
cgit v0.12

