15#include "nuitka/prelude.h"
16#include <structmember.h>
20int count_active_Nuitka_Generator_Type;
21int count_allocated_Nuitka_Generator_Type;
22int count_released_Nuitka_Generator_Type;
27#include "CompiledGeneratorTypeUncompiledIntegration.c"
31NUITKA_MAY_BE_UNUSED
static void _PRINT_GENERATOR_STATUS(
char const *descriptor,
char const *context,
35 switch (generator->m_status) {
37 status =
"(finished)";
50 PRINT_STRING(descriptor);
52 PRINT_STRING(context);
54 PRINT_ITEM((PyObject *)generator);
58 PRINT_REFCOUNT((PyObject *)generator);
62#define PRINT_GENERATOR_STATUS(context, generator) _PRINT_GENERATOR_STATUS(__FUNCTION__, context, generator)
66#if _DEBUG_GENERATOR || _DEBUG_COROUTINE || _DEBUG_ASYNCGEN
68NUITKA_MAY_BE_UNUSED
static void PRINT_COROUTINE_VALUE(
char const *name, PyObject *value) {
73 PRINT_REFCOUNT(value);
78NUITKA_MAY_BE_UNUSED
static void PRINT_COROUTINE_STRING(
char const *name,
char const *value) {
87 generator->m_status = status_Finished;
89#if PYTHON_VERSION >= 0x3b0
90 if (generator->m_frame) {
91 generator->m_frame->m_frame_state = FRAME_COMPLETED;
97 generator->m_running = 1;
99 if (generator->m_frame) {
100 Nuitka_Frame_MarkAsExecuting(generator->m_frame);
105 generator->m_running = 0;
107 if (generator->m_frame) {
108 Nuitka_Frame_MarkAsNotExecuting(generator->m_frame);
113#if PYTHON_VERSION < 0x300
114 return Nuitka_String_FromFormat(
"<compiled_generator object %s at %p>", Nuitka_String_AsString(generator->m_name),
116#elif PYTHON_VERSION < 0x350
117 return Nuitka_String_FromFormat(
"<compiled_generator object %U at %p>", generator->m_name, generator);
120 return Nuitka_String_FromFormat(
"<compiled_generator object %U at %p>", generator->m_qualname, generator);
124static long Nuitka_Generator_tp_traverse(
struct Nuitka_GeneratorObject *generator, visitproc visit,
void *arg) {
125 CHECK_OBJECT(generator);
128#if PYTHON_VERSION >= 0x300
129 Py_VISIT(generator->m_yield_from);
132 for (Py_ssize_t i = 0; i < generator->m_closure_given; i++) {
133 Py_VISIT(generator->m_closure[i]);
136 Py_VISIT(generator->m_frame);
142 for (Py_ssize_t i = 0; i < generator->m_closure_given; i++) {
143 CHECK_OBJECT(generator->m_closure[i]);
144 Py_DECREF(generator->m_closure[i]);
147 generator->m_closure_given = 0;
150static PyObject *_Nuitka_CallGeneratorCodeC(PyThreadState *tstate,
struct Nuitka_GeneratorObject *generator,
151 PyObject *send_value) {
153#if PYTHON_VERSION < 0x300
154 return ((generator_code)generator->m_code)(tstate, generator, send_value);
158#if PYTHON_VERSION < 0x3b0
159 if (generator->m_resume_exception.exception_type != NULL) {
160 SET_CURRENT_EXCEPTION(tstate, &generator->m_resume_exception);
163 if (generator->m_resume_exception.exception_value != NULL) {
164 SET_CURRENT_EXCEPTION(tstate, &generator->m_resume_exception);
168 PyObject *result = ((generator_code)generator->m_code)(tstate, generator, send_value);
170#if PYTHON_VERSION < 0x3b0
171 if (enter_exception.exception_type != NULL) {
172 if (enter_exception.exception_type != Py_None) {
173 if (EXC_TYPE(tstate) != enter_exception.exception_type ||
174 EXC_VALUE(tstate) != enter_exception.exception_value) {
175 generator->m_resume_exception = GET_CURRENT_EXCEPTION(tstate);
177 SET_CURRENT_EXCEPTION(tstate, &enter_exception);
179 Py_DECREF(enter_exception.exception_type);
180 Py_XDECREF(enter_exception.exception_value);
181 Py_XDECREF(enter_exception.exception_tb);
184 Py_DECREF(enter_exception.exception_type);
185 Py_XDECREF(enter_exception.exception_value);
186 Py_XDECREF(enter_exception.exception_tb);
190 if (enter_exception.exception_value != NULL) {
191 if (enter_exception.exception_value != Py_None) {
192 if (EXC_VALUE(tstate) != enter_exception.exception_value) {
193 generator->m_resume_exception = GET_CURRENT_EXCEPTION(tstate);
195 SET_CURRENT_EXCEPTION(tstate, &enter_exception);
197 Py_DECREF(enter_exception.exception_value);
200 Py_DECREF_IMMORTAL(Py_None);
209#if PYTHON_VERSION >= 0x300
212static PyObject *ERROR_GET_STOP_ITERATION_VALUE(PyThreadState *tstate) {
213 assert(PyErr_ExceptionMatches(PyExc_StopIteration));
216 FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
218#if PYTHON_VERSION < 0x3c0
219 Py_DECREF(saved_exception_state.exception_type);
220 Py_XDECREF(saved_exception_state.exception_tb);
224 PyObject *exception_value = saved_exception_state.exception_value;
226 PyObject *value = NULL;
228 if (exception_value != NULL) {
229 if (EXCEPTION_MATCH_BOOL_SINGLE(tstate, exception_value, PyExc_StopIteration)) {
230 value = ((PyStopIterationObject *)exception_value)->value;
232 Py_DECREF(exception_value);
234 value = exception_value;
239 Py_INCREF_IMMORTAL(Py_None);
246static PyObject *Nuitka_CallGeneratorThrowMethod(PyObject *throw_method,
251#if PYTHON_VERSION < 0x3c0
253 PyObject_CallFunctionObjArgs(throw_method, exception_state->exception_type, exception_state->exception_value,
254 exception_state->exception_tb, NULL);
260 PyObject *result = PyObject_CallFunctionObjArgs(throw_method, exception_state->exception_value, NULL);
268#if PYTHON_VERSION >= 0x350
269static PyObject *_Nuitka_Coroutine_throw2(PyThreadState *tstate,
struct Nuitka_CoroutineObject *coroutine,
bool closing,
273static PyObject *_Nuitka_YieldFromPassExceptionTo(PyThreadState *tstate, PyObject *value,
277 if (EXCEPTION_STATE_MATCH_BOOL_SINGLE(tstate, exception_state, PyExc_GeneratorExit)) {
278 PyObject *close_method = PyObject_GetAttr(value, const_str_plain_close);
281 PyObject *close_value = PyObject_Call(close_method, const_tuple_empty, NULL);
282 Py_DECREF(close_method);
284 if (unlikely(close_value == NULL)) {
286 RELEASE_ERROR_OCCURRED_STATE(exception_state);
291 Py_DECREF(close_value);
293 PyObject *error = GET_ERROR_OCCURRED(tstate);
295 if (error != NULL && !EXCEPTION_MATCH_BOOL_SINGLE(tstate, error, PyExc_AttributeError)) {
296 PyErr_WriteUnraisable((PyObject *)value);
301 RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
306#if NUITKA_UNCOMPILED_THROW_INTEGRATION
307 if (PyGen_CheckExact(value)
308#
if PYTHON_VERSION >= 0x350
309 || PyCoro_CheckExact(value)
312 PyGenObject *gen = (PyGenObject *)value;
315 PyObject *result = Nuitka_UncompiledGenerator_throw(tstate, gen, 1, exception_state);
321 if (Nuitka_Generator_Check(value)) {
324 return _Nuitka_Generator_throw2(tstate, gen, exception_state);
327#if PYTHON_VERSION >= 0x350
328 if (Nuitka_Coroutine_Check(value)) {
329 struct Nuitka_CoroutineObject *coro = ((
struct Nuitka_CoroutineObject *)value);
331 return _Nuitka_Coroutine_throw2(tstate, coro,
true, exception_state);
334 if (Nuitka_CoroutineWrapper_Check(value)) {
335 struct Nuitka_CoroutineObject *coro = ((
struct Nuitka_CoroutineWrapperObject *)value)->m_coroutine;
337 return _Nuitka_Coroutine_throw2(tstate, coro,
true, exception_state);
341 PyObject *throw_method = PyObject_GetAttr(value, const_str_plain_throw);
343 if (throw_method != NULL) {
344 PyObject *result = Nuitka_CallGeneratorThrowMethod(throw_method, exception_state);
345 Py_DECREF(throw_method);
348 RELEASE_ERROR_OCCURRED_STATE(exception_state);
352 assert(HAS_ERROR_OCCURRED(tstate));
354 if (EXCEPTION_MATCH_BOOL_SINGLE(tstate, GET_ERROR_OCCURRED(tstate), PyExc_AttributeError)) {
356 RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
359 RELEASE_ERROR_OCCURRED_STATE(exception_state);
366static PyObject *_Nuitka_YieldFromGeneratorCore(PyThreadState *tstate,
struct Nuitka_GeneratorObject *generator,
367 PyObject *yield_from, PyObject *send_value) {
372 CHECK_OBJECT(yield_from);
373 assert(send_value != NULL || HAS_ERROR_OCCURRED(tstate));
378 PRINT_STRING(
"YIELD CORE:");
380 PRINT_ITEM( send_value );
386 FETCH_ERROR_OCCURRED_STATE(tstate, &exception_state);
389 if (HAS_EXCEPTION_STATE(&exception_state)) {
391 retval = _Nuitka_YieldFromPassExceptionTo(tstate, yield_from, &exception_state);
394 if (unlikely(send_value == NULL)) {
395 PyObject *error = GET_ERROR_OCCURRED(tstate);
397 if (error != NULL && EXCEPTION_MATCH_BOOL_SINGLE(tstate, error, PyExc_StopIteration)) {
398 generator->m_returned = ERROR_GET_STOP_ITERATION_VALUE(tstate);
399 assert(!HAS_ERROR_OCCURRED(tstate));
404 }
else if (PyGen_CheckExact(yield_from)) {
405 retval = Nuitka_PyGen_Send(tstate, (PyGenObject *)yield_from, Py_None);
407#if PYTHON_VERSION >= 0x350
408 else if (PyCoro_CheckExact(yield_from)) {
409 retval = Nuitka_PyGen_Send(tstate, (PyGenObject *)yield_from, Py_None);
412 else if (send_value == Py_None && Py_TYPE(yield_from)->tp_iternext != NULL) {
413 retval = Py_TYPE(yield_from)->tp_iternext(yield_from);
417#if PYTHON_VERSION >= 0x300
418 retval = PyObject_CallMethodObjArgs(yield_from, const_str_plain_send, send_value, NULL);
420 retval = PyObject_CallMethod(yield_from, (
char *)
"send", (
char *)
"O", send_value);
425 if (retval == NULL) {
426 PyObject *error = GET_ERROR_OCCURRED(tstate);
429 Py_INCREF_IMMORTAL(Py_None);
430 generator->m_returned = Py_None;
431 }
else if (likely(EXCEPTION_MATCH_BOOL_SINGLE(tstate, error, PyExc_StopIteration))) {
436 generator->m_returned = ERROR_GET_STOP_ITERATION_VALUE(tstate);
437 assert(!HAS_ERROR_OCCURRED(tstate));
446static PyObject *Nuitka_YieldFromGeneratorCore(PyThreadState *tstate,
struct Nuitka_GeneratorObject *generator,
447 PyObject *send_value) {
448 CHECK_OBJECT(generator);
449 CHECK_OBJECT_X(send_value);
451 PyObject *yield_from = generator->m_yield_from;
452 CHECK_OBJECT(yield_from);
455 generator->m_yield_from = NULL;
456 PyObject *yielded = _Nuitka_YieldFromGeneratorCore(tstate, generator, yield_from, send_value);
458 if (yielded == NULL) {
459 Py_DECREF(yield_from);
461 if (generator->m_returned != NULL) {
462 PyObject *yield_from_result = generator->m_returned;
463 generator->m_returned = NULL;
465 yielded = _Nuitka_CallGeneratorCodeC(tstate, generator, yield_from_result);
467 assert(HAS_ERROR_OCCURRED(tstate));
468 yielded = _Nuitka_CallGeneratorCodeC(tstate, generator, NULL);
472 generator->m_yield_from = yield_from;
478static PyObject *Nuitka_YieldFromGeneratorNext(PyThreadState *tstate,
struct Nuitka_GeneratorObject *generator) {
479 CHECK_OBJECT(generator);
482#if PYTHON_VERSION >= 0x350
483 if (PyCoro_CheckExact(generator->m_yield_from) || Nuitka_Coroutine_Check(generator->m_yield_from)) {
484 if (unlikely((generator->m_code_object->co_flags & CO_ITERABLE_COROUTINE) == 0)) {
485 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
486 "cannot 'yield from' a coroutine object in a non-coroutine generator");
491 PyObject *new_iterator = MAKE_ITERATOR(tstate, generator->m_yield_from);
492 if (new_iterator != NULL) {
493 Py_DECREF(generator->m_yield_from);
494 generator->m_yield_from = new_iterator;
498 return Nuitka_YieldFromGeneratorCore(tstate, generator, Py_None);
501static PyObject *Nuitka_YieldFromGeneratorInitial(PyThreadState *tstate,
struct Nuitka_GeneratorObject *generator,
502 PyObject *send_value) {
503 PyObject *result = Nuitka_YieldFromGeneratorCore(tstate, generator, send_value);
506 PRINT_STRING(
"RES:");
507 PRINT_ITEM( result );
516static void _Nuitka_GeneratorPopFrame(PyThreadState *tstate, Nuitka_ThreadStateFrameType *return_frame) {
517#if PYTHON_VERSION < 0x3b0
518 tstate->frame = return_frame;
520 CURRENT_TSTATE_INTERPRETER_FRAME(tstate) = return_frame;
523 PRINT_TOP_FRAME(
"Generator pop exit gives top frame:");
526#if PYTHON_VERSION >= 0x350
527static void RAISE_RUNTIME_ERROR_RAISED_STOP_ITERATION(PyThreadState *tstate,
char const *message) {
530 FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
532#if PYTHON_VERSION < 0x3c0
533 NORMALIZE_EXCEPTION_STATE(tstate, &saved_exception_state);
537 SET_EXCEPTION_PRESERVATION_STATE_FROM_TYPE0_STR(tstate, &new_exception_state, PyExc_RuntimeError, message);
539#if PYTHON_VERSION < 0x3c0
540 NORMALIZE_EXCEPTION_STATE(tstate, &new_exception_state);
543 Py_INCREF(saved_exception_state.exception_value);
544 RAISE_EXCEPTION_WITH_CAUSE(tstate, &new_exception_state, saved_exception_state.exception_value);
546 Nuitka_Exception_SetContext(new_exception_state.exception_value, saved_exception_state.exception_value);
548 RELEASE_ERROR_OCCURRED_STATE_X(&saved_exception_state);
549 RESTORE_ERROR_OCCURRED_STATE(tstate, &new_exception_state);
555 CHECK_OBJECT(generator);
556 assert(Nuitka_Generator_Check((PyObject *)generator));
557 CHECK_EXCEPTION_STATE_X(exception_state);
558 CHECK_OBJECT_X(value);
561 PRINT_GENERATOR_STATUS(
"Enter", generator);
562 PRINT_COROUTINE_VALUE(
"value", value);
563 PRINT_EXCEPTION_STATE(exception_state);
564 PRINT_CURRENT_EXCEPTION();
569 ASSERT_EMPTY_EXCEPTION_STATE(exception_state);
572 if (generator->m_status != status_Finished) {
573 if (generator->m_running) {
576 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ValueError,
"generator already executing");
580#if PYTHON_VERSION < 0x300
581 PyObject *saved_exception_type = tstate->exc_type;
582 PyObject *saved_exception_value = NULL;
583 PyTracebackObject *saved_exception_traceback = NULL;
585 if (saved_exception_type != Py_None && saved_exception_type != NULL) {
586 saved_exception_value = tstate->exc_value;
587 Py_INCREF(saved_exception_type);
588 Py_XINCREF(saved_exception_value);
589 saved_exception_traceback = (PyTracebackObject *)tstate->exc_traceback;
590 Py_XINCREF(saved_exception_traceback);
595 Nuitka_ThreadStateFrameType *return_frame = _Nuitka_GetThreadStateFrame(tstate);
597 if (generator->m_status == status_Unused) {
598 generator->m_status = status_Running;
604 pushFrameStackGeneratorCompiledFrame(tstate, generator->m_frame);
608 Nuitka_MarkGeneratorAsRunning(generator);
611 if (unlikely(HAS_EXCEPTION_STATE(exception_state))) {
613 assert(value == NULL);
616 RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
620 PRINT_GENERATOR_STATUS(
"Switching to generator", generator);
621 PRINT_COROUTINE_VALUE(
"value", value);
622 PRINT_CURRENT_EXCEPTION();
629#if PYTHON_VERSION >= 0x300
630 if (generator->m_yield_from == NULL) {
631 yielded = _Nuitka_CallGeneratorCodeC(tstate, generator, value);
634 yielded = Nuitka_YieldFromGeneratorInitial(tstate, generator, value);
638 yielded = _Nuitka_CallGeneratorCodeC(tstate, generator, value);
641#if PYTHON_VERSION >= 0x300
644 while (yielded == NULL && generator->m_yield_from != NULL) {
645 yielded = Nuitka_YieldFromGeneratorNext(tstate, generator);
648 Nuitka_MarkGeneratorAsNotRunning(generator);
651 if (generator->m_frame) {
653 assertFrameObject(generator->m_frame);
655 if (generator->m_frame->m_frame.f_back) {
656 Py_CLEAR(generator->m_frame->m_frame.f_back);
661 _Nuitka_GeneratorPopFrame(tstate, return_frame);
664 PRINT_GENERATOR_STATUS(
"Returned from generator", generator);
668 if (yielded == NULL) {
670 PRINT_GENERATOR_STATUS(
"finishing from yield", generator);
671 PRINT_STRING(
"-> finishing generator sets status_Finished\n");
672 PRINT_COROUTINE_VALUE(
"return_value", generator->m_returned);
673 PRINT_CURRENT_EXCEPTION();
676 Nuitka_MarkGeneratorAsFinished(generator);
678 if (generator->m_frame != NULL) {
679#if PYTHON_VERSION >= 0x300
680 Nuitka_SetFrameGenerator(generator->m_frame, NULL);
682 Py_DECREF(generator->m_frame);
683 generator->m_frame = NULL;
686 Nuitka_Generator_release_closure(generator);
688#if PYTHON_VERSION < 0x300
689 if (saved_exception_type != NULL && saved_exception_type != Py_None) {
690 Py_DECREF(saved_exception_type);
691 Py_XDECREF(saved_exception_value);
692 Py_XDECREF(saved_exception_traceback);
696#if PYTHON_VERSION >= 0x350
698#
if PYTHON_VERSION < 0x370
699 generator->m_code_object->co_flags & CO_FUTURE_GENERATOR_STOP &&
701 GET_ERROR_OCCURRED(tstate) == PyExc_StopIteration) {
702 RAISE_RUNTIME_ERROR_RAISED_STOP_ITERATION(tstate,
"generator raised StopIteration");
711#if PYTHON_VERSION >= 0x300
712 if (generator->m_returned) {
713 if (generator->m_returned != Py_None) {
714 Nuitka_SetStopIterationValue(tstate, generator->m_returned);
717 Py_DECREF(generator->m_returned);
718 generator->m_returned = NULL;
721 PRINT_GENERATOR_STATUS(
"Return value to exception set", generator);
722 PRINT_CURRENT_EXCEPTION();
730#if _NUITKA_MAINTAIN_SYS_EXC_VARS
731 PyObject *old_type = tstate->exc_type;
732 PyObject *old_value = tstate->exc_value;
733 PyTracebackObject *old_tb = (PyTracebackObject *)tstate->exc_traceback;
736 PyObject *sys_dict = tstate->interp->sysdict;
737 CHECK_OBJECT(sys_dict);
739 if (saved_exception_type != NULL && saved_exception_type != Py_None) {
740 tstate->exc_type = saved_exception_type;
741 tstate->exc_value = saved_exception_value;
742 tstate->exc_traceback = (PyObject *)saved_exception_traceback;
744 Py_XDECREF(old_type);
745 Py_XDECREF(old_value);
748 if (old_type != saved_exception_type) {
749 DICT_SET_ITEM(sys_dict, const_str_plain_exc_type, saved_exception_type);
751 if (saved_exception_value != old_value) {
752 DICT_SET_ITEM(sys_dict, const_str_plain_exc_value,
753 saved_exception_value ? saved_exception_value : Py_None);
755 if (saved_exception_traceback != old_tb) {
756 DICT_SET_ITEM(sys_dict, const_str_plain_exc_traceback,
757 saved_exception_traceback ? (PyObject *)saved_exception_traceback : Py_None);
760 tstate->exc_type = Py_None;
761 tstate->exc_value = Py_None;
762 tstate->exc_traceback = (PyObject *)Py_None;
764 Py_INCREF_IMMORTAL(Py_None);
765 Py_INCREF_IMMORTAL(Py_None);
766 Py_INCREF_IMMORTAL(Py_None);
768 Py_XDECREF(old_type);
769 Py_XDECREF(old_value);
772 if (old_type != Py_None) {
773 DICT_SET_ITEM(sys_dict, const_str_plain_exc_type, Py_None);
775 if (old_value != Py_None) {
776 DICT_SET_ITEM(sys_dict, const_str_plain_exc_value, Py_None);
778 if (old_tb != (PyTracebackObject *)Py_None) {
779 DICT_SET_ITEM(sys_dict, const_str_plain_exc_traceback, Py_None);
790 RELEASE_ERROR_OCCURRED_STATE_X(exception_state);
799 PyThreadState *tstate = PyThreadState_GET();
801 if (generator->m_status == status_Unused && value != Py_None) {
803#if PYTHON_VERSION >= 0x3a0 && PYTHON_VERSION < 0x3a2
804 Nuitka_MarkGeneratorAsFinished(generator);
807 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
808 "can't send non-None value to a just-started generator");
816 INIT_ERROR_OCCURRED_STATE(&exception_state);
818 PyObject *result = _Nuitka_Generator_send(tstate, generator, value, &exception_state);
820 if (result == NULL) {
821 if (HAS_ERROR_OCCURRED(tstate) ==
false) {
822 SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
831 PRINT_GENERATOR_STATUS(
"Enter", generator);
832 PRINT_CURRENT_EXCEPTION();
836 PyThreadState *tstate = PyThreadState_GET();
838 Py_INCREF_IMMORTAL(Py_None);
841 INIT_ERROR_OCCURRED_STATE(&exception_state);
843 return _Nuitka_Generator_send(tstate, generator, Py_None, &exception_state);
848PyObject *Nuitka_Generator_qiter(PyThreadState *tstate,
struct Nuitka_GeneratorObject *generator,
bool *finished) {
849 Py_INCREF_IMMORTAL(Py_None);
852 INIT_ERROR_OCCURRED_STATE(&exception_state);
854 PyObject *result = _Nuitka_Generator_send(tstate, generator, Py_None, &exception_state);
856 if (result == NULL) {
857 if (unlikely(!CHECK_AND_CLEAR_STOP_ITERATION_OCCURRED(tstate))) {
870static bool DROP_ERROR_OCCURRED_GENERATOR_EXIT_OR_STOP_ITERATION(PyThreadState *tstate) {
871 PyObject *error = GET_ERROR_OCCURRED(tstate);
873 if (EXCEPTION_MATCH_GENERATOR(tstate, error)) {
874 CLEAR_ERROR_OCCURRED(tstate);
885 PRINT_GENERATOR_STATUS(
"Enter", generator);
887 CHECK_OBJECT(generator);
889 if (generator->m_status == status_Running) {
891 SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(tstate, &exception_state, PyExc_GeneratorExit, NULL, NULL);
893 PyObject *result = _Nuitka_Generator_send(tstate, generator, NULL, &exception_state);
895 if (unlikely(result)) {
898 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError,
"generator ignored GeneratorExit");
901 PyObject *error = GET_ERROR_OCCURRED(tstate);
909 return DROP_ERROR_OCCURRED_GENERATOR_EXIT_OR_STOP_ITERATION(tstate);
917 PyThreadState *tstate = PyThreadState_GET();
919 bool r = _Nuitka_Generator_close(tstate, generator);
921 if (unlikely(r ==
false)) {
924 Py_INCREF_IMMORTAL(Py_None);
929#if PYTHON_VERSION >= 0x3c0
930static bool _Nuitka_Generator_check_throw_args(PyThreadState *tstate, PyObject **exception_type,
931 PyObject **exception_value, PyTracebackObject **exception_tb) {
932 if (*exception_tb == (PyTracebackObject *)Py_None) {
933 *exception_tb = NULL;
934 }
else if (*exception_tb != NULL && !PyTraceBack_Check(*exception_tb)) {
935 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
"throw() third argument must be a traceback object");
939 if (PyExceptionClass_Check(*exception_type)) {
940 NORMALIZE_EXCEPTION(tstate, exception_type, exception_value, exception_tb);
941 }
else if (PyExceptionInstance_Check(*exception_type)) {
942 if (*exception_value != NULL && *exception_value != Py_None) {
943 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
944 "instance exception may not have a separate value");
950 *exception_value = *exception_type;
951 *exception_type = PyExceptionInstance_Class(*exception_type);
952 Py_INCREF(*exception_type);
954#if PYTHON_VERSION < 0x300
955 PyErr_Format(PyExc_TypeError,
"exceptions must be classes, or instances, not %s",
956 Py_TYPE(*exception_type)->tp_name);
958 PyErr_Format(PyExc_TypeError,
"exceptions must be classes or instances deriving from BaseException, not %s",
959 Py_TYPE(*exception_type)->tp_name);
973static bool _Nuitka_Generator_make_throw_exception_state(PyThreadState *tstate,
975 PyObject *exception_type, PyObject *exception_value,
976 PyTracebackObject *exception_tb) {
978#if PYTHON_VERSION >= 0x3c0
979 Py_INCREF(exception_type);
980 Py_XINCREF(exception_value);
981 Py_XINCREF(exception_tb);
983 if (_Nuitka_Generator_check_throw_args(tstate, &exception_type, &exception_value, &exception_tb) ==
false) {
984 Py_DECREF(exception_type);
985 Py_XDECREF(exception_value);
986 Py_XDECREF(exception_tb);
992 SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(tstate, exception_state, exception_type, exception_value, exception_tb);
994#if PYTHON_VERSION >= 0x3c0
995 Py_DECREF(exception_type);
996 Py_XDECREF(exception_value);
997 Py_XDECREF(exception_tb);
1006static bool _Nuitka_Generator_check_throw(PyThreadState *tstate,
1008 CHECK_EXCEPTION_STATE(exception_state);
1010#if PYTHON_VERSION < 0x3c0
1011 if (exception_state->exception_tb == (PyTracebackObject *)Py_None) {
1012 Py_DECREF(exception_state->exception_tb);
1013 exception_state->exception_tb = NULL;
1014 }
else if (exception_state->exception_tb != NULL && !PyTraceBack_Check(exception_state->exception_tb)) {
1015 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
"throw() third argument must be a traceback object");
1019 if (PyExceptionClass_Check(exception_state->exception_type)) {
1021 NORMALIZE_EXCEPTION_STATE(tstate, exception_state);
1022 }
else if (PyExceptionInstance_Check(exception_state->exception_type)) {
1023 if (exception_state->exception_value != NULL && exception_state->exception_value != Py_None) {
1024 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
1025 "instance exception may not have a separate value");
1031 Py_XDECREF(exception_state->exception_value);
1032 exception_state->exception_value = exception_state->exception_type;
1034 exception_state->exception_type = PyExceptionInstance_Class(exception_state->exception_type);
1035 Py_INCREF(exception_state->exception_type);
1037#if PYTHON_VERSION < 0x300
1038 PyErr_Format(PyExc_TypeError,
"exceptions must be classes, or instances, not %s",
1039 Py_TYPE(exception_state->exception_type)->tp_name);
1041 PyErr_Format(PyExc_TypeError,
"exceptions must be classes or instances deriving from BaseException, not %s",
1042 Py_TYPE(exception_state->exception_type)->tp_name);
1051#if PYTHON_VERSION < 0x3c0
1055 RELEASE_ERROR_OCCURRED_STATE(exception_state);
1060#if PYTHON_VERSION >= 0x300
1063#if PYTHON_VERSION >= 0x350
1064static bool _Nuitka_Coroutine_close(PyThreadState *tstate,
struct Nuitka_CoroutineObject *coroutine);
1065#if PYTHON_VERSION >= 0x360
1066static bool _Nuitka_Asyncgen_close(PyThreadState *tstate,
struct Nuitka_AsyncgenObject *asyncgen);
1071static bool Nuitka_gen_close_iter(PyThreadState *tstate, PyObject *yield_from) {
1073 PRINT_STRING(
"Nuitka_gen_close_iter: Enter\n");
1076 CHECK_OBJECT(yield_from);
1081 if (Nuitka_Generator_Check(yield_from)) {
1083 PRINT_STRING(
"Nuitka_gen_close_iter: Defer to _Nuitka_Generator_close\n");
1088#if PYTHON_VERSION >= 0x350
1089 if (Nuitka_Coroutine_Check(yield_from)) {
1091 PRINT_STRING(
"Nuitka_gen_close_iter: Defer to _Nuitka_Coroutine_close\n");
1093 return _Nuitka_Coroutine_close(tstate, (
struct Nuitka_CoroutineObject *)yield_from);
1097#if PYTHON_VERSION >= 0x360
1098 if (Nuitka_Asyncgen_Check(yield_from)) {
1100 PRINT_STRING(
"Nuitka_gen_close_iter: Defer to _Nuitka_Asyncgen_close\n");
1102 return _Nuitka_Asyncgen_close(tstate, (
struct Nuitka_AsyncgenObject *)yield_from);
1106 PyObject *meth = PyObject_GetAttr(yield_from, const_str_plain_close);
1108 if (unlikely(meth == NULL)) {
1109 if (unlikely(!PyErr_ExceptionMatches(PyExc_AttributeError))) {
1111 PRINT_STRING(
"Nuitka_gen_close_iter: Strange error while looking up close method.\n");
1113 PyErr_WriteUnraisable(yield_from);
1116 CLEAR_ERROR_OCCURRED(tstate);
1119 PRINT_STRING(
"Nuitka_gen_close_iter: Leave, has no close method.\n");
1124 PyObject *retval = CALL_FUNCTION_NO_ARGS(tstate, meth);
1127 if (unlikely(retval == NULL)) {
1129 PRINT_STRING(
"Nuitka_gen_close_iter: Leave, exception from close.\n");
1134 CHECK_OBJECT(retval);
1138 PRINT_STRING(
"Nuitka_gen_close_iter: Leave, closed.\n");
1145#if PYTHON_VERSION >= 0x360
1146static bool Nuitka_AsyncgenAsend_Check(PyObject *
object);
1152static PyObject *_Nuitka_Generator_throw2(PyThreadState *tstate,
struct Nuitka_GeneratorObject *generator,
1155 PRINT_GENERATOR_STATUS(
"Enter", generator);
1156 PRINT_COROUTINE_VALUE(
"yield_from", generator->m_yield_from);
1157 PRINT_EXCEPTION_STATE(exception_state);
1161 CHECK_OBJECT(generator);
1162 assert(Nuitka_Generator_Check((PyObject *)generator));
1163 CHECK_EXCEPTION_STATE(exception_state);
1165#if PYTHON_VERSION >= 0x300
1166 if (generator->m_yield_from != NULL) {
1167 if (EXCEPTION_STATE_MATCH_BOOL_SINGLE(tstate, exception_state, PyExc_GeneratorExit)) {
1169 Nuitka_MarkGeneratorAsRunning(generator);
1170 bool res = Nuitka_gen_close_iter(tstate, generator->m_yield_from);
1171 Nuitka_MarkGeneratorAsNotRunning(generator);
1175 RELEASE_ERROR_OCCURRED_STATE(exception_state);
1177 FETCH_ERROR_OCCURRED_STATE(tstate, exception_state);
1181 return _Nuitka_Generator_send(tstate, generator, NULL, exception_state);
1187 PRINT_GENERATOR_STATUS(
"Passing to yielded from", generator);
1188 PRINT_COROUTINE_VALUE(
"m_yield_from", generator->m_yield_from);
1192 if (Nuitka_Generator_Check(generator->m_yield_from)) {
1195 Nuitka_MarkGeneratorAsRunning(generator);
1196 ret = _Nuitka_Generator_throw2(tstate, gen, exception_state);
1197 Nuitka_MarkGeneratorAsNotRunning(generator);
1198#if NUITKA_UNCOMPILED_THROW_INTEGRATION
1199 }
else if (PyGen_CheckExact(generator->m_yield_from)) {
1200 PyGenObject *gen = (PyGenObject *)generator->m_yield_from;
1203 Nuitka_MarkGeneratorAsRunning(generator);
1204 ret = Nuitka_UncompiledGenerator_throw(tstate, gen, 1, exception_state);
1205 Nuitka_MarkGeneratorAsNotRunning(generator);
1207#if PYTHON_VERSION >= 0x350
1208 }
else if (Nuitka_Coroutine_Check(generator->m_yield_from)) {
1209 struct Nuitka_CoroutineObject *coro = ((
struct Nuitka_CoroutineObject *)generator->m_yield_from);
1211 Nuitka_MarkGeneratorAsRunning(generator);
1212 ret = _Nuitka_Coroutine_throw2(tstate, coro,
true, exception_state);
1213 Nuitka_MarkGeneratorAsNotRunning(generator);
1214 }
else if (Nuitka_CoroutineWrapper_Check(generator->m_yield_from)) {
1215 struct Nuitka_CoroutineObject *coro =
1216 ((
struct Nuitka_CoroutineWrapperObject *)generator->m_yield_from)->m_coroutine;
1219 Nuitka_MarkGeneratorAsRunning(generator);
1220 ret = _Nuitka_Coroutine_throw2(tstate, coro,
true, exception_state);
1221 Nuitka_MarkGeneratorAsNotRunning(generator);
1222#if NUITKA_UNCOMPILED_THROW_INTEGRATION
1223 }
else if (PyCoro_CheckExact(generator->m_yield_from)) {
1224 PyGenObject *gen = (PyGenObject *)generator->m_yield_from;
1227 Nuitka_MarkGeneratorAsRunning(generator);
1228 ret = Nuitka_UncompiledGenerator_throw(tstate, gen, 1, exception_state);
1229 Nuitka_MarkGeneratorAsNotRunning(generator);
1231#if PYTHON_VERSION >= 0x360
1232 }
else if (Nuitka_AsyncgenAsend_Check(generator->m_yield_from)) {
1237 Nuitka_MarkGeneratorAsRunning(generator);
1238 ret = _Nuitka_AsyncgenAsend_throw2(tstate, asyncgen_asend, exception_state);
1239 Nuitka_MarkGeneratorAsNotRunning(generator);
1243 PyObject *meth = PyObject_GetAttr(generator->m_yield_from, const_str_plain_throw);
1244 if (unlikely(meth == NULL)) {
1245 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
1247 RELEASE_ERROR_OCCURRED_STATE(exception_state);
1252 CLEAR_ERROR_OCCURRED(tstate);
1258 CHECK_EXCEPTION_STATE(exception_state);
1262 PRINT_ITEM(coroutine->m_yield_from);
1265 Nuitka_MarkGeneratorAsRunning(generator);
1266 ret = Nuitka_CallGeneratorThrowMethod(meth, exception_state);
1267 Nuitka_MarkGeneratorAsNotRunning(generator);
1272 RELEASE_ERROR_OCCURRED_STATE(exception_state);
1275 if (unlikely(ret == NULL)) {
1277 if (generator->m_yield_from != NULL) {
1278 CHECK_OBJECT(generator->m_yield_from);
1280 PRINT_GENERATOR_STATUS(
"Null return, yield from removal:", generator);
1281 PRINT_COROUTINE_VALUE(
"yield_from", generator->m_yield_from);
1283 Py_DECREF(generator->m_yield_from);
1284 generator->m_yield_from = NULL;
1288 if (Nuitka_PyGen_FetchStopIterationValue(tstate, &val)) {
1292 PRINT_GENERATOR_STATUS(
"Sending return value into ourselves", generator);
1293 PRINT_COROUTINE_VALUE(
"value", val);
1298 INIT_ERROR_OCCURRED_STATE(&no_exception_state);
1300 ret = _Nuitka_Generator_send(tstate, generator, val, &no_exception_state);
1303 PRINT_GENERATOR_STATUS(
"Sending exception value into ourselves", generator);
1304 PRINT_CURRENT_EXCEPTION();
1309 INIT_ERROR_OCCURRED_STATE(&no_exception_state);
1311 ret = _Nuitka_Generator_send(tstate, generator, NULL, &no_exception_state);
1315 PRINT_GENERATOR_STATUS(
"Leave with value/exception from sending into ourselves:", generator);
1316 PRINT_COROUTINE_VALUE(
"return_value", ret);
1317 PRINT_CURRENT_EXCEPTION();
1322 PRINT_GENERATOR_STATUS(
"Leave with return value:", generator);
1323 PRINT_COROUTINE_VALUE(
"return_value", ret);
1324 PRINT_CURRENT_EXCEPTION();
1337 if (unlikely(_Nuitka_Generator_check_throw(tstate, exception_state) ==
false)) {
1342 if (generator->m_status == status_Running) {
1344 PyObject *result = _Nuitka_Generator_send(tstate, generator, NULL, exception_state);
1346 if (result == NULL) {
1347 if (HAS_ERROR_OCCURRED(tstate) ==
false) {
1348 SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
1353 }
else if (generator->m_status == status_Finished) {
1354 RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
1358 PyTracebackObject *exception_tb = GET_EXCEPTION_STATE_TRACEBACK(exception_state);
1360 if (exception_tb == NULL) {
1365 MAKE_FUNCTION_FRAME(tstate, generator->m_code_object, generator->m_module, 0);
1366 SET_EXCEPTION_STATE_TRACEBACK(exception_state,
1367 MAKE_TRACEBACK(frame, generator->m_code_object->co_firstlineno));
1371 RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
1373 Nuitka_MarkGeneratorAsFinished(generator);
1380 PyObject *exception_type;
1381 PyObject *exception_value = NULL;
1382 PyTracebackObject *exception_tb = NULL;
1385 int res = PyArg_UnpackTuple(args,
"throw", 1, 3, &exception_type, &exception_value, &exception_tb);
1387 if (unlikely(res == 0)) {
1391 PyThreadState *tstate = PyThreadState_GET();
1395 if (_Nuitka_Generator_make_throw_exception_state(tstate, &exception_state, exception_type, exception_value,
1396 exception_tb) ==
false) {
1400 PyObject *result = _Nuitka_Generator_throw2(tstate, generator, &exception_state);
1402 if (result == NULL) {
1403 if (HAS_ERROR_OCCURRED(tstate) ==
false) {
1404 SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
1409 PRINT_GENERATOR_STATUS(
"Leave", generator);
1410 PRINT_EXCEPTION(exception_type, exception_value, exception_tb);
1411 PRINT_COROUTINE_VALUE(
"return value", result);
1412 PRINT_CURRENT_EXCEPTION();
1418#if PYTHON_VERSION >= 0x300
1421#if PYTHON_VERSION >= 0x300
1423#if PYTHON_VERSION < 0x380
1424#define _PyGC_CLEAR_FINALIZED(o) _PyGC_SET_FINALIZED(o, 0)
1425#elif PYTHON_VERSION < 0x3d0
1426#define _PyGCHead_SET_UNFINALIZED(g) ((g)->_gc_prev &= (~_PyGC_PREV_MASK_FINALIZED))
1427#define _PyGC_CLEAR_FINALIZED(o) _PyGCHead_SET_UNFINALIZED(_Py_AS_GC(o))
1431#if !defined(_PyGC_FINALIZED) && PYTHON_VERSION < 0x3d0
1432#define _PyGC_FINALIZED(o) _PyGCHead_FINALIZED(_Py_AS_GC(o))
1434#if !defined(_PyType_IS_GC) && PYTHON_VERSION < 0x3d0
1435#define _PyType_IS_GC(t) PyType_HasFeature((t), Py_TPFLAGS_HAVE_GC)
1439static void Nuitka_CallFinalizer(PyObject *self) {
1440 PyTypeObject *type = Py_TYPE(self);
1443 assert(type->tp_finalize != NULL);
1445 assert(_PyType_IS_GC(type));
1446 if (_PyGC_FINALIZED(self)) {
1450 type->tp_finalize(self);
1452#if PYTHON_VERSION >= 0x380
1453 _PyGC_SET_FINALIZED(self);
1455 _PyGC_SET_FINALIZED(self, 1);
1460static bool Nuitka_CallFinalizerFromDealloc(PyObject *self) {
1461 assert(Py_REFCNT(self) == 0);
1464 Py_SET_REFCNT(self, 1);
1466 Nuitka_CallFinalizer(self);
1468 assert(Py_REFCNT(self) > 0);
1471 Py_SET_REFCNT(self, Py_REFCNT(self) - 1);
1472 if (Py_REFCNT(self) == 0) {
1475 assert((!_PyType_IS_GC(Py_TYPE(self)) || _PyObject_GC_IS_TRACKED(self)));
1482 if (generator->m_status != status_Running) {
1486 PyThreadState *tstate = PyThreadState_GET();
1489 FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
1491 bool close_result = _Nuitka_Generator_close(tstate, generator);
1493 if (unlikely(close_result ==
false)) {
1494 PyErr_WriteUnraisable((PyObject *)generator);
1498 RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
1503#define MAX_GENERATOR_FREE_LIST_COUNT 100
1505static int free_list_generators_count = 0;
1509 count_active_Nuitka_Generator_Type -= 1;
1510 count_released_Nuitka_Generator_Type += 1;
1513 if (generator->m_weakrefs != NULL) {
1514 Nuitka_GC_UnTrack(generator);
1520 PyObject_ClearWeakRefs((PyObject *)generator);
1522 Nuitka_GC_Track(generator);
1525#if PYTHON_VERSION >= 0x300
1526 if (Nuitka_CallFinalizerFromDealloc((PyObject *)generator) ==
false) {
1531 assert(Py_REFCNT(generator) == 0);
1532 Py_SET_REFCNT(generator, 1);
1534 PyThreadState *tstate = PyThreadState_GET();
1538 FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
1540 if (generator->m_status == status_Running) {
1541 bool close_result = _Nuitka_Generator_close(tstate, generator);
1542 CHECK_OBJECT(generator);
1544 if (unlikely(close_result ==
false)) {
1545 PyErr_WriteUnraisable((PyObject *)generator);
1549 Nuitka_Generator_release_closure(generator);
1552 Py_SET_REFCNT(generator, Py_REFCNT(generator) - 1);
1553 if (Py_REFCNT(generator) >= 1) {
1559 Nuitka_GC_UnTrack(generator);
1561 Nuitka_Generator_release_closure(generator);
1563 if (generator->m_frame != NULL) {
1564#if PYTHON_VERSION >= 0x300
1565 Nuitka_SetFrameGenerator(generator->m_frame, NULL);
1567 Py_DECREF(generator->m_frame);
1570 Py_DECREF(generator->m_name);
1572#if PYTHON_VERSION >= 0x350
1573 Py_DECREF(generator->m_qualname);
1576#if PYTHON_VERSION >= 0x300
1579 _PyGC_CLEAR_FINALIZED((PyObject *)generator);
1583 releaseToFreeList(free_list_generators, generator, MAX_GENERATOR_FREE_LIST_COUNT);
1585#if PYTHON_VERSION < 0x300
1586 RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
1590static long Nuitka_Generator_tp_hash(
struct Nuitka_GeneratorObject *generator) {
return generator->m_counter; }
1592static PyObject *Nuitka_Generator_get_name(PyObject *self,
void *data) {
1594 PyObject *result = generator->m_name;
1599#if PYTHON_VERSION >= 0x350
1600static int Nuitka_Generator_set_name(PyObject *self, PyObject *value,
void *data) {
1602 if (unlikely((value == NULL) || !PyUnicode_Check(value))) {
1603 PyThreadState *tstate = PyThreadState_GET();
1605 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
"__name__ must be set to a string object");
1610 PyObject *tmp = generator->m_name;
1612 generator->m_name = value;
1618static PyObject *Nuitka_Generator_get_qualname(PyObject *self,
void *data) {
1620 PyObject *result = generator->m_qualname;
1625static int Nuitka_Generator_set_qualname(PyObject *self, PyObject *value,
void *data) {
1627 if (unlikely((value == NULL) || !PyUnicode_Check(value))) {
1628 PyThreadState *tstate = PyThreadState_GET();
1630 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
"__qualname__ must be set to a string object");
1635 PyObject *tmp = generator->m_qualname;
1637 generator->m_qualname = value;
1643static PyObject *Nuitka_Generator_get_yield_from(PyObject *self,
void *data) {
1645 if (generator->m_yield_from) {
1646 Py_INCREF(generator->m_yield_from);
1647 return generator->m_yield_from;
1649 Py_INCREF_IMMORTAL(Py_None);
1656static PyObject *Nuitka_Generator_get_code(PyObject *self,
void *data) {
1658 PyObject *result = (PyObject *)generator->m_code_object;
1663static int Nuitka_Generator_set_code(PyObject *self, PyObject *value,
void *data) {
1664 PyThreadState *tstate = PyThreadState_GET();
1666 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError,
"gi_code is not writable in Nuitka");
1670static PyObject *Nuitka_Generator_get_frame(PyObject *self,
void *data) {
1674 if (generator->m_frame) {
1675 result = (PyObject *)generator->m_frame;
1684static int Nuitka_Generator_set_frame(PyObject *self, PyObject *value,
void *data) {
1685 PyThreadState *tstate = PyThreadState_GET();
1687 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError,
"gi_frame is not writable in Nuitka");
1691static PyObject *Nuitka_Generator_get_running(PyObject *self,
void *data) {
1696#if PYTHON_VERSION < 0x300
1697 result = Nuitka_PyInt_FromLong(generator->m_running);
1699 result = BOOL_FROM(generator->m_running != 0);
1700 Py_INCREF_IMMORTAL(result);
1705static int Nuitka_Generator_set_running(PyObject *self, PyObject *value,
void *data) {
1706#if PYTHON_VERSION < 0x300
1707 PyObject *exception_type = PyExc_TypeError;
1709 PyObject *exception_type = PyExc_AttributeError;
1712 PyThreadState *tstate = PyThreadState_GET();
1714#if !defined(_NUITKA_FULL_COMPAT) || PYTHON_VERSION >= 0x3a0
1715 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, exception_type,
1716 "attribute 'gi_running' of 'generator' objects is not writable");
1718 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, exception_type,
"readonly attribute");
1725static PyGetSetDef Nuitka_Generator_tp_getset[] = {
1726#if PYTHON_VERSION < 0x350
1727 {(
char *)
"__name__", Nuitka_Generator_get_name, NULL, NULL},
1729 {(
char *)
"__name__", Nuitka_Generator_get_name, Nuitka_Generator_set_name, NULL},
1730 {(
char *)
"__qualname__", Nuitka_Generator_get_qualname, Nuitka_Generator_set_qualname, NULL},
1731 {(
char *)
"gi_yieldfrom", Nuitka_Generator_get_yield_from, NULL, NULL},
1733 {(
char *)
"gi_code", Nuitka_Generator_get_code, Nuitka_Generator_set_code, NULL},
1734 {(
char *)
"gi_frame", Nuitka_Generator_get_frame, Nuitka_Generator_set_frame, NULL},
1735 {(
char *)
"gi_running", Nuitka_Generator_get_running, Nuitka_Generator_set_running, NULL},
1739static PyMethodDef Nuitka_Generator_methods[] = {{
"send", (PyCFunction)Nuitka_Generator_send, METH_O, NULL},
1740 {
"throw", (PyCFunction)Nuitka_Generator_throw, METH_VARARGS, NULL},
1741 {
"close", (PyCFunction)Nuitka_Generator_close, METH_NOARGS, NULL},
1745#if PYTHON_VERSION >= 0x3a0
1746static PyAsyncMethods Nuitka_Generator_as_async = {
1755PyTypeObject Nuitka_Generator_Type = {
1756 PyVarObject_HEAD_INIT(NULL, 0)
"compiled_generator",
1759 (destructor)Nuitka_Generator_tp_dealloc,
1763#if PYTHON_VERSION < 0x3a0
1766 &Nuitka_Generator_as_async,
1768 (reprfunc)Nuitka_Generator_tp_repr,
1772 (hashfunc)Nuitka_Generator_tp_hash,
1778#if PYTHON_VERSION < 0x300
1779 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
1781 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE,
1785 (traverseproc)Nuitka_Generator_tp_traverse,
1790 (iternextfunc)Nuitka_Generator_tp_iternext,
1791 Nuitka_Generator_methods,
1793 Nuitka_Generator_tp_getset,
1811#
if PYTHON_VERSION >= 0x300
1813 (destructor)Nuitka_Generator_tp_finalizer
1817#if PYTHON_VERSION >= 0x350
1818static void _initCompiledCoroutineTypes();
1820#if PYTHON_VERSION >= 0x360
1821static void _initCompiledAsyncgenTypes();
1824void _initCompiledGeneratorType(
void) {
1825 Nuitka_PyType_Ready(&Nuitka_Generator_Type, &PyGen_Type,
true,
false,
true,
false,
false);
1828 assert(Nuitka_Generator_Type.tp_doc != PyGen_Type.tp_doc || PyGen_Type.tp_doc == NULL);
1829 assert(Nuitka_Generator_Type.tp_traverse != PyGen_Type.tp_traverse);
1830 assert(Nuitka_Generator_Type.tp_clear != PyGen_Type.tp_clear || PyGen_Type.tp_clear == NULL);
1831 assert(Nuitka_Generator_Type.tp_richcompare != PyGen_Type.tp_richcompare || PyGen_Type.tp_richcompare == NULL);
1832 assert(Nuitka_Generator_Type.tp_iter != PyGen_Type.tp_iter || PyGen_Type.tp_iter == PyObject_SelfIter);
1833 assert(Nuitka_Generator_Type.tp_iternext != PyGen_Type.tp_iternext || PyGen_Type.tp_iternext == NULL);
1834#if PYTHON_VERSION >= 0x350
1835 assert(Nuitka_Generator_Type.tp_as_async != PyGen_Type.tp_as_async || PyGen_Type.tp_as_async == NULL);
1837 assert(Nuitka_Generator_Type.tp_methods != PyGen_Type.tp_methods);
1838 assert(Nuitka_Generator_Type.tp_members != PyGen_Type.tp_members);
1839 assert(Nuitka_Generator_Type.tp_getset != PyGen_Type.tp_getset);
1840 assert(Nuitka_Generator_Type.tp_base != PyGen_Type.tp_base);
1841 assert(Nuitka_Generator_Type.tp_dict != PyGen_Type.tp_dict);
1842 assert(Nuitka_Generator_Type.tp_descr_get != PyGen_Type.tp_descr_get || PyGen_Type.tp_descr_get == NULL);
1844 assert(Nuitka_Generator_Type.tp_descr_set != PyGen_Type.tp_descr_set || PyGen_Type.tp_descr_set == NULL);
1845 assert(Nuitka_Generator_Type.tp_dictoffset != PyGen_Type.tp_dictoffset || PyGen_Type.tp_dictoffset == 0);
1851 assert(Nuitka_Generator_Type.tp_bases != PyGen_Type.tp_bases);
1852 assert(Nuitka_Generator_Type.tp_mro != PyGen_Type.tp_mro);
1853 assert(Nuitka_Generator_Type.tp_cache != PyGen_Type.tp_cache || PyGen_Type.tp_cache == NULL);
1854 assert(Nuitka_Generator_Type.tp_subclasses != PyGen_Type.tp_subclasses || PyGen_Type.tp_cache == NULL);
1855 assert(Nuitka_Generator_Type.tp_weaklist != PyGen_Type.tp_weaklist);
1856 assert(Nuitka_Generator_Type.tp_del != PyGen_Type.tp_del || PyGen_Type.tp_del == NULL);
1857#if PYTHON_VERSION >= 0x300
1858 assert(Nuitka_Generator_Type.tp_finalize != PyGen_Type.tp_finalize || PyGen_Type.tp_finalize == NULL);
1861#if PYTHON_VERSION >= 0x350
1863 _initCompiledCoroutineTypes();
1866#if PYTHON_VERSION >= 0x360
1868 _initCompiledAsyncgenTypes();
1872PyObject *Nuitka_Generator_New(generator_code code, PyObject *module, PyObject *name,
1873#
if PYTHON_VERSION >= 0x350
1876 PyCodeObject *code_object,
struct Nuitka_CellObject **closure, Py_ssize_t closure_given,
1877 Py_ssize_t heap_storage_size) {
1879 count_active_Nuitka_Generator_Type += 1;
1880 count_allocated_Nuitka_Generator_Type += 1;
1886 Py_ssize_t full_size = closure_given + (heap_storage_size +
sizeof(
void *) - 1) /
sizeof(
void *);
1889 allocateFromFreeList(free_list_generators,
struct Nuitka_GeneratorObject, Nuitka_Generator_Type, full_size);
1892 result->m_heap_storage = &result->m_closure[closure_given];
1894 assert(result != NULL);
1895 CHECK_OBJECT(result);
1897 assert(Py_SIZE(result) >= closure_given);
1899 result->m_code = (
void *)code;
1901 CHECK_OBJECT(module);
1902 result->m_module =
module;
1905 result->m_name = name;
1908#if PYTHON_VERSION >= 0x350
1910 if (qualname == NULL) {
1913 CHECK_OBJECT(qualname);
1915 result->m_qualname = qualname;
1916 Py_INCREF(qualname);
1919#if PYTHON_VERSION >= 0x300
1920 result->m_yield_from = NULL;
1923 memcpy(&result->m_closure[0], closure, closure_given *
sizeof(
struct Nuitka_CellObject *));
1924 result->m_closure_given = closure_given;
1926 result->m_weakrefs = NULL;
1928 result->m_status = status_Unused;
1929 result->m_running = 0;
1931 result->m_yield_return_index = 0;
1933#if PYTHON_VERSION >= 0x300
1934 result->m_returned = NULL;
1937 result->m_frame = NULL;
1938 result->m_code_object = code_object;
1940#if PYTHON_VERSION >= 0x370
1941 result->m_exc_state = Nuitka_ExceptionStackItem_Empty;
1944#if PYTHON_VERSION >= 0x300
1945 result->m_resume_exception = Nuitka_ExceptionStackItem_Empty;
1948 static long Nuitka_Generator_counter = 0;
1949 result->m_counter = Nuitka_Generator_counter++;
1951 Nuitka_GC_Track(result);
1952 return (PyObject *)result;
1955static PyObject *_EMPTY_GENERATOR_CONTEXT(PyThreadState *tstate,
struct Nuitka_GeneratorObject *generator,
1956 PyObject *yield_return_value) {
1960PyObject *Nuitka_Generator_NewEmpty(PyObject *module, PyObject *name,
1961#
if PYTHON_VERSION >= 0x350
1965 Py_ssize_t closure_given) {
1966 return Nuitka_Generator_New(_EMPTY_GENERATOR_CONTEXT, module, name,
1967#
if PYTHON_VERSION >= 0x350
1970 code_object, closure, closure_given, 0);
1976#if PYTHON_VERSION >= 0x350
1977#include "CompiledCoroutineType.c"
1982#include "CompiledFrameType.c"
Definition CompiledAsyncgenType.c:1293
Definition compiled_cell.h:14
Definition exceptions.h:712
Definition exceptions.h:222
Definition compiled_frame.h:117
Definition compiled_generator.h:41