#ifndef Py_INTERNAL_GENOBJECT_H #define Py_INTERNAL_GENOBJECT_H #ifdef __cplusplus extern "C" { #endif #ifndef Py_BUILD_CORE # error "this header requires Py_BUILD_CORE define" #endif #include "pycore_frame.h" /* _PyGenObject_HEAD defines the initial segment of generator and coroutine objects. */ #define _PyGenObject_HEAD(prefix) \ PyObject_HEAD \ /* List of weak reference. */ \ PyObject *prefix##_weakreflist; \ /* Name of the generator. */ \ PyObject *prefix##_name; \ /* Qualified name of the generator. */ \ PyObject *prefix##_qualname; \ _PyErr_StackItem prefix##_exc_state; \ PyObject *prefix##_origin_or_finalizer; \ char prefix##_hooks_inited; \ char prefix##_closed; \ char prefix##_running_async; \ /* The frame */ \ int8_t prefix##_frame_state; \ struct _PyInterpreterFrame prefix##_iframe; \ struct _PyGenObject { /* The gi_ prefix is intended to remind of generator-iterator. */ _PyGenObject_HEAD(gi) }; struct _PyCoroObject { _PyGenObject_HEAD(cr) }; struct _PyAsyncGenObject { _PyGenObject_HEAD(ag) }; #undef _PyGenObject_HEAD static inline PyGenObject *_PyGen_GetGeneratorFromFrame(_PyInterpreterFrame *frame) { assert(frame->owner == FRAME_OWNED_BY_GENERATOR); size_t offset_in_gen = offsetof(PyGenObject, gi_iframe); return (PyGenObject *)(((char *)frame) - offset_in_gen); } PyAPI_FUNC(PyObject *)_PyGen_yf(PyGenObject *); extern void _PyGen_Finalize(PyObject *self); // Export for '_asyncio' shared extension PyAPI_FUNC(int) _PyGen_SetStopIterationValue(PyObject *); // Export for '_asyncio' shared extension PyAPI_FUNC(int) _PyGen_FetchStopIterationValue(PyObject **); PyAPI_FUNC(PyObject *)_PyCoro_GetAwaitableIter(PyObject *o); extern PyObject *_PyAsyncGenValueWrapperNew(PyThreadState *state, PyObject *); extern PyTypeObject _PyCoroWrapper_Type; extern PyTypeObject _PyAsyncGenWrappedValue_Type; extern PyTypeObject _PyAsyncGenAThrow_Type; #ifdef __cplusplus } #endif #endif /* !Py_INTERNAL_GENOBJECT_H */