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.
This commit is contained in:
Phillip J. Eby 2006-04-10 17:51:05 +00:00
parent 17de8ffc21
commit 2ba96610bf
4 changed files with 29 additions and 1 deletions

View file

@ -5,6 +5,7 @@
#include "genobject.h"
#include "ceval.h"
#include "structmember.h"
#include "opcode.h"
static int
gen_traverse(PyGenObject *gen, visitproc visit, void *arg)
@ -358,3 +359,22 @@ PyGen_New(PyFrameObject *f)
_PyObject_GC_TRACK(gen);
return (PyObject *)gen;
}
int
PyGen_NeedsFinalizing(PyGenObject *gen)
{
int i;
PyFrameObject *f = gen->gi_frame;
if ((PyObject *)f == Py_None || f->f_stacktop==NULL || f->f_iblock<=0)
return 0; /* no frame or no blockstack == no finalization */
for (i=f->f_iblock; i>=0; i--) {
if (f->f_blockstack[i].b_type != SETUP_LOOP)
/* any block type besides a loop requires cleanup */
return 1;
}
/* No blocks except loops, it's safe to skip finalization */
return 0;
}