17db96d56Sopenharmony_ci/* Generator object interface */
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ci#ifndef Py_LIMITED_API
47db96d56Sopenharmony_ci#ifndef Py_GENOBJECT_H
57db96d56Sopenharmony_ci#define Py_GENOBJECT_H
67db96d56Sopenharmony_ci#ifdef __cplusplus
77db96d56Sopenharmony_ciextern "C" {
87db96d56Sopenharmony_ci#endif
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci/* --- Generators --------------------------------------------------------- */
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ci/* _PyGenObject_HEAD defines the initial segment of generator
137db96d56Sopenharmony_ci   and coroutine objects. */
147db96d56Sopenharmony_ci#define _PyGenObject_HEAD(prefix)                                           \
157db96d56Sopenharmony_ci    PyObject_HEAD                                                           \
167db96d56Sopenharmony_ci    /* The code object backing the generator */                             \
177db96d56Sopenharmony_ci    PyCodeObject *prefix##_code;                                            \
187db96d56Sopenharmony_ci    /* List of weak reference. */                                           \
197db96d56Sopenharmony_ci    PyObject *prefix##_weakreflist;                                         \
207db96d56Sopenharmony_ci    /* Name of the generator. */                                            \
217db96d56Sopenharmony_ci    PyObject *prefix##_name;                                                \
227db96d56Sopenharmony_ci    /* Qualified name of the generator. */                                  \
237db96d56Sopenharmony_ci    PyObject *prefix##_qualname;                                            \
247db96d56Sopenharmony_ci    _PyErr_StackItem prefix##_exc_state;                                    \
257db96d56Sopenharmony_ci    PyObject *prefix##_origin_or_finalizer;                                 \
267db96d56Sopenharmony_ci    char prefix##_hooks_inited;                                             \
277db96d56Sopenharmony_ci    char prefix##_closed;                                                   \
287db96d56Sopenharmony_ci    char prefix##_running_async;                                            \
297db96d56Sopenharmony_ci    /* The frame */                                                         \
307db96d56Sopenharmony_ci    int8_t prefix##_frame_state;                                            \
317db96d56Sopenharmony_ci    PyObject *prefix##_iframe[1];
327db96d56Sopenharmony_ci
337db96d56Sopenharmony_citypedef struct {
347db96d56Sopenharmony_ci    /* The gi_ prefix is intended to remind of generator-iterator. */
357db96d56Sopenharmony_ci    _PyGenObject_HEAD(gi)
367db96d56Sopenharmony_ci} PyGenObject;
377db96d56Sopenharmony_ci
387db96d56Sopenharmony_ciPyAPI_DATA(PyTypeObject) PyGen_Type;
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ci#define PyGen_Check(op) PyObject_TypeCheck(op, &PyGen_Type)
417db96d56Sopenharmony_ci#define PyGen_CheckExact(op) Py_IS_TYPE(op, &PyGen_Type)
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyGen_New(PyFrameObject *);
447db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyGen_NewWithQualName(PyFrameObject *,
457db96d56Sopenharmony_ci    PyObject *name, PyObject *qualname);
467db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyGen_SetStopIterationValue(PyObject *);
477db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyGen_FetchStopIterationValue(PyObject **);
487db96d56Sopenharmony_ciPyAPI_FUNC(void) _PyGen_Finalize(PyObject *self);
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_ci
517db96d56Sopenharmony_ci/* --- PyCoroObject ------------------------------------------------------- */
527db96d56Sopenharmony_ci
537db96d56Sopenharmony_citypedef struct {
547db96d56Sopenharmony_ci    _PyGenObject_HEAD(cr)
557db96d56Sopenharmony_ci} PyCoroObject;
567db96d56Sopenharmony_ci
577db96d56Sopenharmony_ciPyAPI_DATA(PyTypeObject) PyCoro_Type;
587db96d56Sopenharmony_ciPyAPI_DATA(PyTypeObject) _PyCoroWrapper_Type;
597db96d56Sopenharmony_ci
607db96d56Sopenharmony_ci#define PyCoro_CheckExact(op) Py_IS_TYPE(op, &PyCoro_Type)
617db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyCoro_New(PyFrameObject *,
627db96d56Sopenharmony_ci    PyObject *name, PyObject *qualname);
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ci
657db96d56Sopenharmony_ci/* --- Asynchronous Generators -------------------------------------------- */
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_citypedef struct {
687db96d56Sopenharmony_ci    _PyGenObject_HEAD(ag)
697db96d56Sopenharmony_ci} PyAsyncGenObject;
707db96d56Sopenharmony_ci
717db96d56Sopenharmony_ciPyAPI_DATA(PyTypeObject) PyAsyncGen_Type;
727db96d56Sopenharmony_ciPyAPI_DATA(PyTypeObject) _PyAsyncGenASend_Type;
737db96d56Sopenharmony_ciPyAPI_DATA(PyTypeObject) _PyAsyncGenWrappedValue_Type;
747db96d56Sopenharmony_ciPyAPI_DATA(PyTypeObject) _PyAsyncGenAThrow_Type;
757db96d56Sopenharmony_ci
767db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyAsyncGen_New(PyFrameObject *,
777db96d56Sopenharmony_ci    PyObject *name, PyObject *qualname);
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ci#define PyAsyncGen_CheckExact(op) Py_IS_TYPE(op, &PyAsyncGen_Type)
807db96d56Sopenharmony_ci
817db96d56Sopenharmony_ci
827db96d56Sopenharmony_ci#undef _PyGenObject_HEAD
837db96d56Sopenharmony_ci
847db96d56Sopenharmony_ci#ifdef __cplusplus
857db96d56Sopenharmony_ci}
867db96d56Sopenharmony_ci#endif
877db96d56Sopenharmony_ci#endif /* !Py_GENOBJECT_H */
887db96d56Sopenharmony_ci#endif /* Py_LIMITED_API */
89