Issue #17807: Generators can now be finalized even when they are part of a reference cycle.

This commit is contained in:
Antoine Pitrou 2013-05-08 18:12:35 +02:00
parent 070cb3c9be
commit 04e70d19e7
8 changed files with 335 additions and 245 deletions

View file

@ -36,6 +36,8 @@ typedef struct _frame {
non-generator frames. See the save_exc_state and swap_exc_state
functions in ceval.c for details of their use. */
PyObject *f_exc_type, *f_exc_value, *f_exc_traceback;
/* Borrowed referenced to a generator, or NULL */
PyObject *f_gen;
PyThreadState *f_tstate;
int f_lasti; /* Last instruction if called */
@ -84,6 +86,13 @@ PyAPI_FUNC(void) _PyFrame_DebugMallocStats(FILE *out);
/* Return the line of code the frame is currently executing. */
PyAPI_FUNC(int) PyFrame_GetLineNumber(PyFrameObject *);
/* Generator support */
PyAPI_FUNC(PyObject *) _PyFrame_YieldingFrom(PyFrameObject *);
PyAPI_FUNC(PyObject *) _PyFrame_GeneratorSend(PyFrameObject *, PyObject *, int exc);
PyAPI_FUNC(PyObject *) _PyFrame_Finalize(PyFrameObject *);
PyAPI_FUNC(int) _PyFrame_CloseIterator(PyObject *);
#ifdef __cplusplus
}
#endif

View file

@ -33,6 +33,7 @@ PyAPI_DATA(PyTypeObject) PyGen_Type;
#define PyGen_CheckExact(op) (Py_TYPE(op) == &PyGen_Type)
PyAPI_FUNC(PyObject *) PyGen_New(struct _frame *);
/* Deprecated, kept for backwards compatibility. */
PyAPI_FUNC(int) PyGen_NeedsFinalizing(PyGenObject *);
PyAPI_FUNC(int) _PyGen_FetchStopIterationValue(PyObject **);
PyObject *_PyGen_Send(PyGenObject *, PyObject *);