@@ -78,6 +78,22 @@ gen_traverse(PyObject *self, visitproc visit, void *arg)
7878 return 0 ;
7979}
8080
81+ void
82+ _PyGen_MoveToReachable (PyObject * op , PyGC_Head * reachable , int visited_space )
83+ {
84+ PyGenObject * gen = (PyGenObject * )op ;
85+ if (gen -> gi_frame_state == FRAME_CLEARED ) {
86+ return ;
87+ }
88+ _PyGC_MoveToReachable (gen -> gi_exc_state .exc_value , reachable , visited_space );
89+ if (gen -> gi_frame_state == FRAME_EXECUTING ) {
90+ /* if executing we already traversed it on the stack */
91+ return ;
92+ }
93+ _PyInterpreterFrame * frame = & gen -> gi_iframe ;
94+ _PyFrame_MoveToReachable (frame , reachable , visited_space );
95+ }
96+
8197void
8298_PyGen_Finalize (PyObject * self )
8399{
@@ -1426,6 +1442,14 @@ typedef struct _PyAsyncGenWrappedValue {
14261442 _Py_CAST(_PyAsyncGenWrappedValue*, (op)))
14271443
14281444
1445+ void
1446+ _PyAsyncGen_MoveToReachable (PyObject * op , PyGC_Head * reachable , int visited_space )
1447+ {
1448+ PyAsyncGenObject * ag = _PyAsyncGenObject_CAST (op );
1449+ _PyGC_MoveToReachable (ag -> ag_origin_or_finalizer , reachable , visited_space );
1450+ _PyGen_MoveToReachable (op , reachable , visited_space );
1451+ }
1452+
14291453static int
14301454async_gen_traverse (PyObject * self , visitproc visit , void * arg )
14311455{
@@ -1634,24 +1658,8 @@ PyTypeObject PyAsyncGen_Type = {
16341658 async_gen_methods , /* tp_methods */
16351659 async_gen_memberlist , /* tp_members */
16361660 async_gen_getsetlist , /* tp_getset */
1637- 0 , /* tp_base */
1638- 0 , /* tp_dict */
1639- 0 , /* tp_descr_get */
1640- 0 , /* tp_descr_set */
1641- 0 , /* tp_dictoffset */
1642- 0 , /* tp_init */
1643- 0 , /* tp_alloc */
1644- 0 , /* tp_new */
1645- 0 , /* tp_free */
1646- 0 , /* tp_is_gc */
1647- 0 , /* tp_bases */
1648- 0 , /* tp_mro */
1649- 0 , /* tp_cache */
1650- 0 , /* tp_subclasses */
1651- 0 , /* tp_weaklist */
1652- 0 , /* tp_del */
1653- 0 , /* tp_version_tag */
1654- _PyGen_Finalize , /* tp_finalize */
1661+ .tp_finalize = _PyGen_Finalize ,
1662+ .tp_version_tag = _Py_TYPE_VERSION_ASYNC_GENERATOR ,
16551663};
16561664
16571665
@@ -1724,6 +1732,14 @@ async_gen_asend_dealloc(PyObject *self)
17241732 _Py_FREELIST_FREE (async_gen_asends , self , PyObject_GC_Del );
17251733}
17261734
1735+ void
1736+ _PyAsyncAsend_MoveToReachable (PyObject * op , PyGC_Head * reachable , int visited_space )
1737+ {
1738+ PyAsyncGenASend * ags = _PyAsyncGenASend_CAST (op );
1739+ _PyGC_MoveToReachable ((PyObject * )ags -> ags_sendval , reachable , visited_space );
1740+ _PyAsyncGen_MoveToReachable ((PyObject * )ags -> ags_gen , reachable , visited_space );
1741+ }
1742+
17271743static int
17281744async_gen_asend_traverse (PyObject * self , visitproc visit , void * arg )
17291745{
@@ -1896,17 +1912,8 @@ PyTypeObject _PyAsyncGenASend_Type = {
18961912 PyObject_SelfIter , /* tp_iter */
18971913 async_gen_asend_iternext , /* tp_iternext */
18981914 async_gen_asend_methods , /* tp_methods */
1899- 0 , /* tp_members */
1900- 0 , /* tp_getset */
1901- 0 , /* tp_base */
1902- 0 , /* tp_dict */
1903- 0 , /* tp_descr_get */
1904- 0 , /* tp_descr_set */
1905- 0 , /* tp_dictoffset */
1906- 0 , /* tp_init */
1907- 0 , /* tp_alloc */
1908- 0 , /* tp_new */
19091915 .tp_finalize = async_gen_asend_finalize ,
1916+ .tp_version_tag = _Py_TYPE_VERSION_ASYNC_ASEND ,
19101917};
19111918
19121919
0 commit comments