final patches from Neil Schemenauer for garbage collection
diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py
new file mode 100644
index 0000000..72253f4
--- /dev/null
+++ b/Lib/test/test_gc.py
@@ -0,0 +1,100 @@
+import gc
+
+def test_list():
+    l = []
+    l.append(l)
+    print 'list 0x%x' % id(l)
+    gc.collect()
+    del l
+    assert gc.collect() == 1
+
+def test_dict():
+    d = {}
+    d[1] = d
+    print 'dict 0x%x' % id(d)
+    gc.collect()
+    del d
+    assert gc.collect() == 1
+
+def test_tuple():
+    l = []
+    t = (l,)
+    l.append(t)
+    print 'list 0x%x' % id(l)
+    print 'tuple 0x%x' % id(t)
+    gc.collect()
+    del t
+    del l
+    assert gc.collect() == 2
+
+def test_class():
+    class A:
+        pass
+    A.a = A
+    print 'class 0x%x' % id(A)
+    gc.collect()
+    del A
+    assert gc.collect() > 0
+
+def test_instance():
+    class A:
+        pass
+    a = A()
+    a.a = a
+    print repr(a)
+    gc.collect()
+    del a
+    assert gc.collect() > 0
+
+def test_method():
+    class A:
+        def __init__(self):
+            self.init = self.__init__
+    a = A()
+    gc.collect()
+    del a
+    assert gc.collect() > 0
+
+def test_finalizer():
+    class A:
+        def __del__(self): pass
+    class B:
+        pass
+    a = A()
+    a.a = a
+    id_a = id(a)
+    b = B()
+    b.b = b
+    print 'a', repr(a)
+    print 'b', repr(b)
+    gc.collect()
+    gc.garbage[:] = []
+    del a
+    del b
+    assert gc.collect() > 0
+    assert id(gc.garbage[0]) == id_a
+
+def test_function():
+    d = {}
+    exec("def f(): pass\n") in d
+    print 'dict 0x%x' % id(d)
+    print 'func 0x%x' % id(d['f'])
+    gc.collect()
+    del d
+    assert gc.collect() == 2
+
+
+def test_all():
+    debug = gc.get_debug()
+    gc.set_debug(gc.DEBUG_LEAK | gc.DEBUG_STATS)
+    test_list()
+    test_dict()
+    test_tuple()
+    test_class()
+    test_instance()
+    test_method()
+    test_finalizer()
+    test_function()
+    gc.set_debug(debug)
+
+test_all()