]> granicus.if.org Git - python/commitdiff
Added a test that provokes the hypothesized (in my last checkin comment)
authorTim Peters <tim.peters@gmail.com>
Thu, 11 Jul 2002 06:56:07 +0000 (06:56 +0000)
committerTim Peters <tim.peters@gmail.com>
Thu, 11 Jul 2002 06:56:07 +0000 (06:56 +0000)
debug-build failure when an instance of a new-style class is resurrected
by a __del__ method -- we simply never had any code that tried this.

This is already fixed in 2.3 CVS.  In 2.2.1, it blows up via

    Fatal Python error: GC object already in linked list

I'll fix it in 2.2.1 CVS next.

Lib/test/test_descr.py

index ea67c4eb7763adca5e4eb93b669a8884ada5e1f0..40694031023fad1b08f6c8e18ac9d9e037088798 100644 (file)
@@ -3183,6 +3183,25 @@ def slices():
     a.__setitem__(slice(0, 2, 1), [2,3])
     vereq(a, [2,3,1])
 
+def subtype_resurrection():
+    if verbose:
+        print "Testing resurrection of new-style instance."
+
+    class C(object):
+        container = []
+
+        def __del__(self):
+            # resurrect the instance
+            C.container.append(self)
+
+    c = C()
+    c.attr = 42
+    # The only interesting thing here is whether this blows up in a
+    # debug build, due to flawed GC tracking logic in typeobject.c's
+    # call_finalizer() (a 2.2.1 bug).
+    del c
+    del C.container[-1]  # resurrect it again for the heck of it
+    vereq(C.container[-1].attr, 42)
 
 def do_this_first():
     if verbose:
@@ -3274,6 +3293,7 @@ def test_main():
     string_exceptions()
     copy_setstate()
     slices()
+    subtype_resurrection()
     if verbose: print "All OK"
 
 if __name__ == "__main__":