3#ifndef __NUITKA_COMPILED_GENERATOR_H__
4#define __NUITKA_COMPILED_GENERATOR_H__
8#include "nuitka/prelude.h"
18enum Generator_Status {
24typedef int Generator_Status;
25static const int status_Unused = 0;
26static const int status_Running = 1;
27static const int status_Finished = 2;
31#if PYTHON_VERSION < 0x3a0
50#if PYTHON_VERSION >= 0x350
53#if PYTHON_VERSION >= 0x300
55 PyObject *m_yield_from;
66 PyCodeObject *m_code_object;
69 Generator_Status m_status;
71#if PYTHON_VERSION >= 0x370
75#if PYTHON_VERSION >= 0x300
80 int m_yield_return_index;
84#if PYTHON_VERSION >= 0x300
98 Py_ssize_t m_closure_given;
102extern PyTypeObject Nuitka_Generator_Type;
106extern PyObject *Nuitka_Generator_New(generator_code code, PyObject *module, PyObject *name,
107#
if PYTHON_VERSION >= 0x350
111 Py_ssize_t closure_given, Py_ssize_t heap_storage_size);
113extern PyObject *Nuitka_Generator_NewEmpty(PyObject *module, PyObject *name,
114#
if PYTHON_VERSION >= 0x350
118 Py_ssize_t closure_given);
123static inline bool Nuitka_Generator_Check(PyObject *
object) {
return Py_TYPE(
object) == &Nuitka_Generator_Type; }
125static inline PyObject *Nuitka_Generator_GetName(PyObject *
object) {
129static inline void SAVE_GENERATOR_EXCEPTION(PyThreadState *tstate,
struct Nuitka_GeneratorObject *generator) {
139 PRINT_STRING(
"SAVE_GENERATOR_EXCEPTION: Saving: ");
140 PRINT_PUBLISHED_EXCEPTION();
143#if PYTHON_VERSION < 0x3b0
144 PyObject *saved_exception_type = EXC_TYPE(tstate);
146 PyObject *saved_exception_value = EXC_VALUE(tstate);
147#if PYTHON_VERSION < 0x3b0
148 PyTracebackObject *saved_exception_traceback = EXC_TRACEBACK(tstate);
151#if PYTHON_VERSION < 0x370
152 EXC_TYPE(tstate) = tstate->frame->f_exc_type;
153 EXC_VALUE(tstate) = tstate->frame->f_exc_value;
154 SET_EXC_TRACEBACK(tstate, tstate->frame->f_exc_traceback);
156#if PYTHON_VERSION < 0x3b0
157 EXC_TYPE(tstate) = generator->m_exc_state.exception_type;
159 EXC_VALUE(tstate) = generator->m_exc_state.exception_value;
160#if PYTHON_VERSION < 0x3b0
161 SET_EXC_TRACEBACK(tstate, generator->m_exc_state.exception_tb);
166 PRINT_STRING(
"SAVE_GENERATOR_EXCEPTION: Restored: ");
167 PRINT_PUBLISHED_EXCEPTION();
170#if PYTHON_VERSION < 0x370
171 tstate->frame->f_exc_type = saved_exception_type;
172 tstate->frame->f_exc_value = saved_exception_value;
173 tstate->frame->f_exc_traceback = (PyObject *)saved_exception_traceback;
175#if PYTHON_VERSION < 0x3b0
176 generator->m_exc_state.exception_type = saved_exception_type;
178 generator->m_exc_state.exception_value = saved_exception_value;
179#if PYTHON_VERSION < 0x3b0
180 generator->m_exc_state.exception_tb = (PyTracebackObject *)saved_exception_traceback;
185static inline void RESTORE_GENERATOR_EXCEPTION(PyThreadState *tstate,
struct Nuitka_GeneratorObject *generator) {
190 PRINT_STRING(
"RESTORE_GENERATOR_EXCEPTION: Replacing :");
191 PRINT_PUBLISHED_EXCEPTION();
194#if PYTHON_VERSION < 0x3b0
195 PyObject *saved_exception_type = EXC_TYPE(tstate);
197 PyObject *saved_exception_value = EXC_VALUE(tstate);
198#if PYTHON_VERSION < 0x3b0
199 PyTracebackObject *saved_exception_traceback = EXC_TRACEBACK(tstate);
202#if PYTHON_VERSION < 0x370
203 EXC_TYPE(tstate) = tstate->frame->f_exc_type;
204 EXC_VALUE(tstate) = tstate->frame->f_exc_value;
205 SET_EXC_TRACEBACK(tstate, tstate->frame->f_exc_traceback);
207 tstate->frame->f_exc_type = saved_exception_type;
208 tstate->frame->f_exc_value = saved_exception_value;
209 tstate->frame->f_exc_traceback = (PyObject *)saved_exception_traceback;
211#if PYTHON_VERSION < 0x3b0
212 EXC_TYPE(tstate) = generator->m_exc_state.exception_type;
214 EXC_VALUE(tstate) = generator->m_exc_state.exception_value;
215#if PYTHON_VERSION < 0x3b0
216 SET_EXC_TRACEBACK(tstate, generator->m_exc_state.exception_tb);
219#if PYTHON_VERSION < 0x3b0
220 generator->m_exc_state.exception_type = saved_exception_type;
222 generator->m_exc_state.exception_value = saved_exception_value;
223#if PYTHON_VERSION < 0x3b0
224 generator->m_exc_state.exception_tb = (PyTracebackObject *)saved_exception_traceback;
229 PRINT_STRING(
"RESTORE_GENERATOR_EXCEPTION: Restored:");
230 PRINT_PUBLISHED_EXCEPTION();
236extern void Nuitka_PreserveHeap(
void *dest, ...);
237extern void Nuitka_RestoreHeap(
void *source, ...);
239NUITKA_MAY_BE_UNUSED
static void STORE_GENERATOR_EXCEPTION(PyThreadState *tstate,
241#if PYTHON_VERSION < 0x3b0
242 EXC_TYPE_F(generator) = EXC_TYPE(tstate);
243 if (EXC_TYPE_F(generator) == Py_None) {
244 EXC_TYPE_F(generator) = NULL;
246 Py_XINCREF(EXC_TYPE_F(generator));
248 EXC_VALUE_F(generator) = EXC_VALUE(tstate);
249 Py_XINCREF(EXC_VALUE_F(generator));
250#if PYTHON_VERSION < 0x3b0
251 ASSIGN_EXC_TRACEBACK_F(generator, EXC_TRACEBACK(tstate));
252 Py_XINCREF(EXC_TRACEBACK_F(generator));
257#if PYTHON_VERSION < 0x3b0
258 Py_CLEAR(EXC_TYPE_F(generator));
260 Py_CLEAR(EXC_VALUE_F(generator));
261#if PYTHON_VERSION < 0x3b0
262 Py_CLEAR(EXC_TRACEBACK_F(generator));
267extern int count_active_Nuitka_Generator_Type;
268extern int count_allocated_Nuitka_Generator_Type;
269extern int count_released_Nuitka_Generator_Type;
Definition compiled_cell.h:14
Definition exceptions.h:222
Definition compiled_frame.h:117
Definition compiled_generator.h:41