summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorPhillip J. Eby <pje@telecommunity.com>2006-04-10 17:51:05 (GMT)
committerPhillip J. Eby <pje@telecommunity.com>2006-04-10 17:51:05 (GMT)
commit2ba96610bfeda03381dd411d5694fae311159a0c (patch)
treea0007d4f0c9ee9bb38dbdef8311e7e0085708097 /Modules
parent17de8ffc215d8539860a8a7f06279c4155382c4f (diff)
downloadcpython-2ba96610bfeda03381dd411d5694fae311159a0c.zip
cpython-2ba96610bfeda03381dd411d5694fae311159a0c.tar.gz
cpython-2ba96610bfeda03381dd411d5694fae311159a0c.tar.bz2
SF Patch #1463867: Improved generator finalization to allow generators
that are suspended outside of any try/except/finally blocks to be garbage collected even if they are part of a cycle. Generators that suspend inside of an active try/except or try/finally block (including those created by a ``with`` statement) are still not GC-able if they are part of a cycle, however.
Diffstat (limited to 'Modules')
-rw-r--r--Modules/gcmodule.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c
index a8976b3..5bf95b9 100644
--- a/Modules/gcmodule.c
+++ b/Modules/gcmodule.c
@@ -413,8 +413,12 @@ has_finalizer(PyObject *op)
assert(delstr != NULL);
return _PyInstance_Lookup(op, delstr) != NULL;
}
- else
+ else if (PyType_HasFeature(op->ob_type, Py_TPFLAGS_HEAPTYPE))
return op->ob_type->tp_del != NULL;
+ else if (PyGen_CheckExact(op))
+ return PyGen_NeedsFinalizing((PyGenObject *)op);
+ else
+ return 0;
}
/* Move the objects in unreachable with __del__ methods into `finalizers`.