• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /* Generator object interface */
3 
4 #ifndef Py_LIMITED_API
5 #ifndef Py_GENOBJECT_H
6 #define Py_GENOBJECT_H
7 #ifdef __cplusplus
8 extern "C" {
9 #endif
10 
11 #include "pystate.h"   /* _PyErr_StackItem */
12 #include "abstract.h" /* PySendResult */
13 
14 /* _PyGenObject_HEAD defines the initial segment of generator
15    and coroutine objects. */
16 #define _PyGenObject_HEAD(prefix)                                           \
17     PyObject_HEAD                                                           \
18     /* Note: gi_frame can be NULL if the generator is "finished" */         \
19     PyFrameObject *prefix##_frame;                                          \
20     /* The code object backing the generator */                             \
21     PyObject *prefix##_code;                                                \
22     /* List of weak reference. */                                           \
23     PyObject *prefix##_weakreflist;                                         \
24     /* Name of the generator. */                                            \
25     PyObject *prefix##_name;                                                \
26     /* Qualified name of the generator. */                                  \
27     PyObject *prefix##_qualname;                                            \
28     _PyErr_StackItem prefix##_exc_state;
29 
30 typedef struct {
31     /* The gi_ prefix is intended to remind of generator-iterator. */
32     _PyGenObject_HEAD(gi)
33 } PyGenObject;
34 
35 PyAPI_DATA(PyTypeObject) PyGen_Type;
36 
37 #define PyGen_Check(op) PyObject_TypeCheck(op, &PyGen_Type)
38 #define PyGen_CheckExact(op) Py_IS_TYPE(op, &PyGen_Type)
39 
40 PyAPI_FUNC(PyObject *) PyGen_New(PyFrameObject *);
41 PyAPI_FUNC(PyObject *) PyGen_NewWithQualName(PyFrameObject *,
42     PyObject *name, PyObject *qualname);
43 PyAPI_FUNC(int) _PyGen_SetStopIterationValue(PyObject *);
44 PyAPI_FUNC(int) _PyGen_FetchStopIterationValue(PyObject **);
45 PyObject *_PyGen_yf(PyGenObject *);
46 PyAPI_FUNC(void) _PyGen_Finalize(PyObject *self);
47 
48 #ifndef Py_LIMITED_API
49 typedef struct {
50     _PyGenObject_HEAD(cr)
51     PyObject *cr_origin;
52 } PyCoroObject;
53 
54 PyAPI_DATA(PyTypeObject) PyCoro_Type;
55 PyAPI_DATA(PyTypeObject) _PyCoroWrapper_Type;
56 
57 #define PyCoro_CheckExact(op) Py_IS_TYPE(op, &PyCoro_Type)
58 PyObject *_PyCoro_GetAwaitableIter(PyObject *o);
59 PyAPI_FUNC(PyObject *) PyCoro_New(PyFrameObject *,
60     PyObject *name, PyObject *qualname);
61 
62 /* Asynchronous Generators */
63 
64 typedef struct {
65     _PyGenObject_HEAD(ag)
66     PyObject *ag_finalizer;
67 
68     /* Flag is set to 1 when hooks set up by sys.set_asyncgen_hooks
69        were called on the generator, to avoid calling them more
70        than once. */
71     int ag_hooks_inited;
72 
73     /* Flag is set to 1 when aclose() is called for the first time, or
74        when a StopAsyncIteration exception is raised. */
75     int ag_closed;
76 
77     int ag_running_async;
78 } PyAsyncGenObject;
79 
80 PyAPI_DATA(PyTypeObject) PyAsyncGen_Type;
81 PyAPI_DATA(PyTypeObject) _PyAsyncGenASend_Type;
82 PyAPI_DATA(PyTypeObject) _PyAsyncGenWrappedValue_Type;
83 PyAPI_DATA(PyTypeObject) _PyAsyncGenAThrow_Type;
84 
85 PyAPI_FUNC(PyObject *) PyAsyncGen_New(PyFrameObject *,
86     PyObject *name, PyObject *qualname);
87 
88 #define PyAsyncGen_CheckExact(op) Py_IS_TYPE(op, &PyAsyncGen_Type)
89 
90 PyObject *_PyAsyncGenValueWrapperNew(PyObject *);
91 
92 #endif
93 
94 #undef _PyGenObject_HEAD
95 
96 #ifdef __cplusplus
97 }
98 #endif
99 #endif /* !Py_GENOBJECT_H */
100 #endif /* Py_LIMITED_API */
101