]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Backport gvanrossum's checkin of revisions
authorMichael W. Hudson <mwh@python.net>
Fri, 4 Jan 2002 12:28:43 +0000 (12:28 +0000)
committerMichael W. Hudson <mwh@python.net>
Fri, 4 Jan 2002 12:28:43 +0000 (12:28 +0000)
  copy.py, 1.23 & test_descr.py, 1.114:

Fix for SF bug ##497426: can't deepcopy recursive new objects

deepcopy(), _reconstruct(): pass the memo to the other function, so
that recursive data structures built out of new-style objects may be
deeply copied correctly.

2.2.1 bugfix!

Lib/copy.py
Lib/test/test_descr.py

index 14eff057345c6e56ea335281f57c217596dfcb34..86fc978e71a3bf713544a27a76ccc79f1e30c1b3 100644 (file)
@@ -172,7 +172,7 @@ def deepcopy(x, memo = None):
                 raise error, \
                       "un-deep-copyable object of type %s" % type(x)
             else:
-                y = _reconstruct(x, reductor(), 1)
+                y = _reconstruct(x, reductor(), 1, memo)
         else:
             y = copier(memo)
     else:
@@ -279,10 +279,12 @@ def _deepcopy_inst(x, memo):
     return y
 d[types.InstanceType] = _deepcopy_inst
 
-def _reconstruct(x, info, deep):
+def _reconstruct(x, info, deep, memo=None):
     if isinstance(info, str):
         return x
     assert isinstance(info, tuple)
+    if memo is None:
+        memo = {}
     n = len(info)
     assert n in (2, 3)
     callable, args = info[:2]
@@ -291,11 +293,11 @@ def _reconstruct(x, info, deep):
     else:
         state = {}
     if deep:
-        args = deepcopy(args)
+        args = deepcopy(args, memo)
     y = callable(*args)
     if state:
         if deep:
-            state = deepcopy(state)
+            state = deepcopy(state, memo)
         y.__dict__.update(state)
     return y
 
index ea987f223c7198d1bc601b150ebf39c6ce10b9b8..dd95ddeb91e2ef9b153154ee1ade3188daf69f14 100644 (file)
@@ -2702,7 +2702,15 @@ def strops():
     vereq('%c' % 5, '\x05')
     vereq('%c' % '5', '5')
 
-
+def deepcopyrecursive():
+    if verbose: print "Testing deepcopy of recursive objects..."
+    class Node:
+        pass
+    a = Node()
+    b = Node()
+    a.b = b
+    b.a = a
+    z = deepcopy(a) # This blew up before
 
 
 def test_main():
@@ -2759,6 +2767,7 @@ def test_main():
     delhook()
     hashinherit()
     strops()
+    deepcopyrecursive()
     if verbose: print "All OK"
 
 if __name__ == "__main__":