4#include "nuitka/freelists.h"
5#include "nuitka/prelude.h"
6#include <structmember.h>
11int count_active_Nuitka_Frame_Type = 0;
12int count_allocated_Nuitka_Frame_Type = 0;
13int count_released_Nuitka_Frame_Type = 0;
18int count_active_frame_cache_instances = 0;
19int count_allocated_frame_cache_instances = 0;
20int count_released_frame_cache_instances = 0;
21int count_hit_frame_cache_instances = 0;
24#if PYTHON_VERSION < 0x3b0
25static PyMemberDef Nuitka_Frame_members[] = {
26 {(
char *)
"f_back", T_OBJECT, offsetof(PyFrameObject, f_back), READONLY | RESTRICTED},
27 {(
char *)
"f_code", T_OBJECT, offsetof(PyFrameObject, f_code), READONLY | RESTRICTED},
28 {(
char *)
"f_builtins", T_OBJECT, offsetof(PyFrameObject, f_builtins), READONLY | RESTRICTED},
29 {(
char *)
"f_globals", T_OBJECT, offsetof(PyFrameObject, f_globals), READONLY | RESTRICTED},
30 {(
char *)
"f_lasti", T_INT, offsetof(PyFrameObject, f_lasti), READONLY | RESTRICTED},
34#define Nuitka_Frame_members 0
37#if PYTHON_VERSION < 0x300
39static PyObject *_Nuitka_Frame_get_exc_traceback(PyObject *self,
void *data) {
40 assert(Nuitka_Frame_CheckExact(self));
42 assert(_PyObject_GC_IS_TRACKED(self));
45 PyObject *result = frame->m_frame.f_exc_traceback;
55static int _Nuitka_Frame_set_exc_traceback(PyObject *self, PyObject *traceback,
void *data) {
56 assert(Nuitka_Frame_CheckExact(self));
58 assert(_PyObject_GC_IS_TRACKED(self));
61 Py_XDECREF(frame->m_frame.f_exc_traceback);
63 if (traceback == Py_None) {
67 frame->m_frame.f_exc_traceback = traceback;
68 Py_XINCREF(traceback);
73static PyObject *_Nuitka_Frame_get_exc_type(PyObject *self,
void *data) {
74 assert(Nuitka_Frame_CheckExact(self));
76 assert(_PyObject_GC_IS_TRACKED(self));
81 if (frame->m_frame.f_exc_type != NULL) {
82 result = frame->m_frame.f_exc_type;
91static int _Nuitka_Frame_set_exc_type(PyObject *self, PyObject *exception_type,
void *data) {
92 assert(Nuitka_Frame_CheckExact(self));
94 assert(_PyObject_GC_IS_TRACKED(self));
97 PyObject *old = frame->m_frame.f_exc_type;
99 if (exception_type == Py_None) {
100 exception_type = NULL;
103 frame->m_frame.f_exc_type = exception_type;
104 Py_XINCREF(frame->m_frame.f_exc_type);
111static PyObject *_Nuitka_Frame_get_exc_value(PyObject *self,
void *data) {
112 assert(Nuitka_Frame_CheckExact(self));
114 assert(_PyObject_GC_IS_TRACKED(self));
119 if (frame->m_frame.f_exc_value != NULL) {
120 result = frame->m_frame.f_exc_value;
129static int _Nuitka_Frame_set_exc_value(PyObject *self, PyObject *exception_value,
void *data) {
130 assert(Nuitka_Frame_CheckExact(self));
132 assert(_PyObject_GC_IS_TRACKED(self));
135 PyObject *old = frame->m_frame.f_exc_value;
137 if (exception_value == Py_None) {
138 exception_value = NULL;
141 frame->m_frame.f_exc_value = exception_value;
142 Py_XINCREF(exception_value);
148static PyObject *_Nuitka_Frame_get_restricted(PyObject *self,
void *data) {
149 assert(Nuitka_Frame_CheckExact(self));
151 assert(_PyObject_GC_IS_TRACKED(self));
153 Py_INCREF_IMMORTAL(Py_False);
159static PyObject *_Nuitka_Frame_get_locals(PyObject *self,
void *data) {
160 assert(Nuitka_Frame_CheckExact(self));
162 assert(_PyObject_GC_IS_TRACKED(self));
164 NUITKA_MAY_BE_UNUSED PyThreadState *tstate = PyThreadState_GET();
167 if (nuitka_frame->m_type_description == NULL) {
168#if PYTHON_VERSION < 0x3b0
169 PyFrameObject *locals_owner = &nuitka_frame->m_frame;
171 _PyInterpreterFrame *locals_owner = &nuitka_frame->m_interpreter_frame;
174 if (locals_owner->f_locals == NULL) {
175 locals_owner->f_locals = MAKE_DICT_EMPTY(tstate);
178 Py_INCREF(locals_owner->f_locals);
179 return locals_owner->f_locals;
181 PyObject *result = MAKE_DICT_EMPTY(tstate);
182 PyObject **var_names = Nuitka_GetCodeVarNames(Nuitka_GetFrameCodeObject(nuitka_frame));
184 char const *w = nuitka_frame->m_type_description;
185 char const *t = nuitka_frame->m_locals_storage;
189 case NUITKA_TYPE_DESCRIPTION_OBJECT:
190 case NUITKA_TYPE_DESCRIPTION_OBJECT_PTR: {
191 PyObject *value = *(PyObject **)t;
192 CHECK_OBJECT_X(value);
195 DICT_SET_ITEM(result, *var_names, value);
198 t +=
sizeof(PyObject *);
202 case NUITKA_TYPE_DESCRIPTION_CELL: {
204 assert(Nuitka_Cell_Check((PyObject *)value));
207 if (value->ob_ref != NULL) {
208 DICT_SET_ITEM(result, *var_names, value->ob_ref);
215 case NUITKA_TYPE_DESCRIPTION_NULL: {
218 case NUITKA_TYPE_DESCRIPTION_BOOL: {
219 int value = *(
int *)t;
221 switch ((nuitka_bool)value) {
222 case NUITKA_BOOL_TRUE: {
223 DICT_SET_ITEM(result, *var_names, Py_True);
226 case NUITKA_BOOL_FALSE: {
227 DICT_SET_ITEM(result, *var_names, Py_False);
247static PyObject *_Nuitka_Frame_get_lineno(PyObject *self,
void *data) {
248 assert(Nuitka_Frame_CheckExact(self));
250 assert(_PyObject_GC_IS_TRACKED(self));
253 return Nuitka_PyInt_FromLong(frame->m_frame.f_lineno);
256static PyObject *_Nuitka_Frame_get_trace(PyObject *self,
void *data) {
257 assert(Nuitka_Frame_CheckExact(self));
259 assert(_PyObject_GC_IS_TRACKED(self));
262 PyObject *result = frame->m_frame.f_trace;
267static int _Nuitka_Frame_set_trace(PyObject *self, PyObject *value,
void *data) {
268 assert(Nuitka_Frame_CheckExact(self));
270 assert(_PyObject_GC_IS_TRACKED(self));
271#if !defined(_NUITKA_DEPLOYMENT_MODE) && !defined(_NUITKA_NO_DEPLOYMENT_FRAME_USELESS_SET_TRACE)
272 if (value == Py_None) {
275 PyThreadState *tstate = PyThreadState_GET();
277 SET_CURRENT_EXCEPTION_TYPE0_STR(
278 tstate, PyExc_RuntimeError,
279 "f_trace is not writable in Nuitka, ignore with '--no-deployment-flag=frame-useless-set-trace'");
287#if PYTHON_VERSION >= 0x370
288static PyObject *_Nuitka_Frame_get_trace_lines(PyObject *self,
void *data) {
289 assert(Nuitka_Frame_CheckExact(self));
291 assert(_PyObject_GC_IS_TRACKED(self));
293 PyObject *result = Py_False;
294 Py_INCREF_IMMORTAL(result);
298static int _Nuitka_Frame_set_trace_lines(PyObject *self, PyObject *value,
void *data) {
299 assert(Nuitka_Frame_CheckExact(self));
301 assert(_PyObject_GC_IS_TRACKED(self));
303 PyThreadState *tstate = PyThreadState_GET();
305 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError,
"f_trace_lines is not writable in Nuitka");
309static PyObject *_Nuitka_Frame_get_trace_opcodes(PyObject *self,
void *data) {
310 assert(Nuitka_Frame_CheckExact(self));
312 assert(_PyObject_GC_IS_TRACKED(self));
314 PyObject *result = Py_False;
315 Py_INCREF_IMMORTAL(result);
319static int _Nuitka_Frame_set_trace_opcodes(PyObject *self, PyObject *value,
void *data) {
320 assert(Nuitka_Frame_CheckExact(self));
322 assert(_PyObject_GC_IS_TRACKED(self));
324 PyThreadState *tstate = PyThreadState_GET();
326 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError,
"f_trace_opcodes is not writable in Nuitka");
331static PyGetSetDef Nuitka_Frame_tp_getset[] = {
332 {(
char *)
"f_locals", _Nuitka_Frame_get_locals, NULL, NULL},
333 {(
char *)
"f_lineno", _Nuitka_Frame_get_lineno, NULL, NULL},
334 {(
char *)
"f_trace", _Nuitka_Frame_get_trace, _Nuitka_Frame_set_trace, NULL},
335#if PYTHON_VERSION < 0x300
336 {(
char *)
"f_restricted", _Nuitka_Frame_get_restricted, NULL, NULL},
337 {(
char *)
"f_exc_traceback", _Nuitka_Frame_get_exc_traceback, _Nuitka_Frame_set_exc_traceback, NULL},
338 {(
char *)
"f_exc_type", _Nuitka_Frame_get_exc_type, _Nuitka_Frame_set_exc_type, NULL},
339 {(
char *)
"f_exc_value", _Nuitka_Frame_get_exc_value, _Nuitka_Frame_set_exc_value, NULL},
341#if PYTHON_VERSION >= 0x370
342 {(
char *)
"f_trace_lines", _Nuitka_Frame_get_trace_lines, _Nuitka_Frame_set_trace_lines, NULL},
343 {(
char *)
"f_trace_opcodes", _Nuitka_Frame_get_trace_opcodes, _Nuitka_Frame_set_trace_opcodes, NULL},
349 assert(Nuitka_Frame_CheckExact((PyObject *)nuitka_frame));
350 CHECK_OBJECT((PyObject *)nuitka_frame);
351 assert(_PyObject_GC_IS_TRACKED(nuitka_frame));
353#if PYTHON_VERSION >= 0x370
354 PyCodeObject *code_object = Nuitka_GetFrameCodeObject(nuitka_frame);
355 return Nuitka_String_FromFormat(
"<compiled_frame at %p, file %R, line %d, code %S>", nuitka_frame,
356 code_object->co_filename, Nuitka_GetFrameLineNumber(nuitka_frame),
357 code_object->co_name);
358#elif _DEBUG_FRAME || _DEBUG_REFRAME || _DEBUG_EXCEPTIONS
359 PyCodeObject *code_object = Nuitka_GetFrameCodeObject(nuitka_frame);
360 return Nuitka_String_FromFormat(
"<compiled_frame object for %s at %p>",
361 Nuitka_String_AsString(code_object->co_name), nuitka_frame);
363 return Nuitka_String_FromFormat(
"<compiled_frame object at %p>", nuitka_frame);
368 if (frame->m_type_description) {
369 char const *w = frame->m_type_description;
370 char const *t = frame->m_locals_storage;
374 case NUITKA_TYPE_DESCRIPTION_OBJECT:
375 case NUITKA_TYPE_DESCRIPTION_OBJECT_PTR:
376 case NUITKA_TYPE_DESCRIPTION_NILONG: {
377 PyObject *value = *(PyObject **)t;
378 CHECK_OBJECT_X(value);
382 t +=
sizeof(PyObject *);
386 case NUITKA_TYPE_DESCRIPTION_CELL: {
388 assert(Nuitka_Cell_Check((PyObject *)value));
397 case NUITKA_TYPE_DESCRIPTION_NULL: {
400 case NUITKA_TYPE_DESCRIPTION_BOOL: {
412 frame->m_type_description = NULL;
417#define MAX_FRAME_FREE_LIST_COUNT 100
419static int free_list_frames_count = 0;
423 count_active_Nuitka_Frame_Type -= 1;
424 count_released_Nuitka_Frame_Type += 1;
427#ifndef __NUITKA_NO_ASSERT__
429 PyThreadState *tstate = PyThreadState_GET();
432 FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state1);
433 RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state1);
436 Nuitka_GC_UnTrack(nuitka_frame);
438 PyFrameObject *frame = &nuitka_frame->m_frame;
439#if PYTHON_VERSION < 0x3b0
440 PyFrameObject *locals_owner = frame;
442 _PyInterpreterFrame *locals_owner = &nuitka_frame->m_interpreter_frame;
445 assert(Nuitka_GC_IS_TRACKED_X((PyObject *)frame->f_back));
446 Py_XDECREF(frame->f_back);
447 Py_DECREF(locals_owner->f_builtins);
448 Py_DECREF(locals_owner->f_globals);
449 Py_XDECREF(locals_owner->f_locals);
451#if PYTHON_VERSION < 0x370
452 Py_XDECREF(frame->f_exc_type);
453 Py_XDECREF(frame->f_exc_value);
454 Py_XDECREF(frame->f_exc_traceback);
457 Nuitka_Frame_tp_clear(nuitka_frame);
459 if (Py_REFCNT(nuitka_frame) > 0) {
460 Py_SET_REFCNT(nuitka_frame, Py_REFCNT(nuitka_frame) - 1);
461 if (Py_REFCNT(nuitka_frame) >= 1) {
468#if PYTHON_VERSION >= 0x3b0
471 Py_SET_SIZE(nuitka_frame, nuitka_frame->m_ob_size);
474 releaseToFreeList(free_list_frames, nuitka_frame, MAX_FRAME_FREE_LIST_COUNT);
476#ifndef __NUITKA_NO_ASSERT__
478 FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state2);
479 RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state2);
481 ASSERT_SAME_EXCEPTION_STATE(&saved_exception_state1, &saved_exception_state2);
485static int Nuitka_Frame_tp_traverse(
struct Nuitka_FrameObject *frame, visitproc visit,
void *arg) {
486 assert(Nuitka_Frame_CheckExact((PyObject *)frame));
487 CHECK_OBJECT((PyObject *)frame);
488 assert(_PyObject_GC_IS_TRACKED(frame));
490 Py_VISIT(frame->m_frame.f_back);
492#if PYTHON_VERSION < 0x3b0
493 PyFrameObject *locals_owner = &frame->m_frame;
495 _PyInterpreterFrame *locals_owner = &frame->m_interpreter_frame;
498 Py_VISIT(locals_owner->f_builtins);
499 Py_VISIT(locals_owner->f_globals);
502#if PYTHON_VERSION < 0x370
503 Py_VISIT(frame->m_frame.f_exc_type);
504 Py_VISIT(frame->m_frame.f_exc_value);
505 Py_VISIT(frame->m_frame.f_exc_traceback);
509 char const *w = frame->m_type_description;
510 char const *t = frame->m_locals_storage;
512 while (w != NULL && *w != 0) {
514 case NUITKA_TYPE_DESCRIPTION_OBJECT:
515 case NUITKA_TYPE_DESCRIPTION_OBJECT_PTR: {
516 PyObject *value = *(PyObject **)t;
517 CHECK_OBJECT_X(value);
520 t +=
sizeof(PyObject *);
524 case NUITKA_TYPE_DESCRIPTION_CELL: {
526 assert(Nuitka_Cell_Check((PyObject *)value));
535 case NUITKA_TYPE_DESCRIPTION_NULL: {
538 case NUITKA_TYPE_DESCRIPTION_BOOL: {
544 NUITKA_CANNOT_GET_HERE(
"invalid type description");
554#if PYTHON_VERSION >= 0x300
557#if PYTHON_VERSION < 0x3b0
558 return nuitka_frame->m_frame.f_gen;
560 return nuitka_frame->m_generator;
564static PyObject *Nuitka_Frame_clear(
struct Nuitka_FrameObject *frame, PyObject *unused) {
565 assert(Nuitka_Frame_CheckExact((PyObject *)frame));
566 CHECK_OBJECT((PyObject *)frame);
567 assert(_PyObject_GC_IS_TRACKED(frame));
569 PyThreadState *tstate = PyThreadState_GET();
571 if (Nuitka_Frame_IsExecuting(frame)) {
572 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError,
"cannot clear an executing frame");
577#if PYTHON_VERSION >= 0x3b0
578 if (frame->m_frame_state == FRAME_COMPLETED) {
579 Nuitka_Frame_tp_clear(frame);
584 if (frame->m_frame_state == FRAME_EXECUTING) {
585 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError,
"cannot clear an executing frame");
590#if PYTHON_VERSION >= 0x300
592 PyObject *f_gen = Nuitka_GetFrameGenerator(frame);
598 bool close_exception;
600 if (Nuitka_Generator_Check(f_gen)) {
602 Nuitka_SetFrameGenerator(frame, NULL);
604 close_exception = !_Nuitka_Generator_close(tstate, generator);
606#if PYTHON_VERSION >= 0x350
607 else if (Nuitka_Coroutine_Check(f_gen)) {
608 struct Nuitka_CoroutineObject *coroutine = (
struct Nuitka_CoroutineObject *)f_gen;
609 Nuitka_SetFrameGenerator(frame, NULL);
611 close_exception = !_Nuitka_Coroutine_close(tstate, coroutine);
614#if PYTHON_VERSION >= 0x360
615 else if (Nuitka_Asyncgen_Check(f_gen)) {
616 struct Nuitka_AsyncgenObject *asyncgen = (
struct Nuitka_AsyncgenObject *)f_gen;
617 Nuitka_SetFrameGenerator(frame, NULL);
619 close_exception = !_Nuitka_Asyncgen_close(tstate, asyncgen);
626 Nuitka_SetFrameGenerator(frame, NULL);
628 close_exception =
false;
631 if (unlikely(close_exception)) {
632 PyErr_WriteUnraisable(f_gen);
639 Nuitka_Frame_tp_clear(frame);
647 assert(Nuitka_Frame_CheckExact((PyObject *)frame));
648 CHECK_OBJECT((PyObject *)frame);
649 assert(_PyObject_GC_IS_TRACKED(frame));
651#if PYTHON_VERSION < 0x3b0
652 return Py_SIZE(frame);
654 return frame->m_ob_size;
658static PyObject *Nuitka_Frame_sizeof(
struct Nuitka_FrameObject *frame, PyObject *unused) {
659 assert(Nuitka_Frame_CheckExact((PyObject *)frame));
660 CHECK_OBJECT((PyObject *)frame);
661 assert(_PyObject_GC_IS_TRACKED(frame));
666static PyMethodDef Nuitka_Frame_methods[] = {
667#if PYTHON_VERSION >= 0x300
668 {
"clear", (PyCFunction)Nuitka_Frame_clear, METH_NOARGS,
"F.clear(): clear most references held by the frame"},
670 {
"__sizeof__", (PyCFunction)Nuitka_Frame_sizeof, METH_NOARGS,
"F.__sizeof__() -> size of F in memory, in bytes"},
673PyTypeObject Nuitka_Frame_Type = {
674 PyVarObject_HEAD_INIT(NULL, 0)
"compiled_frame",
677 (destructor)Nuitka_Frame_tp_dealloc,
682 (reprfunc)Nuitka_Frame_tp_repr,
692 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
694 (traverseproc)Nuitka_Frame_tp_traverse,
695 (inquiry)Nuitka_Frame_tp_clear,
700 Nuitka_Frame_methods,
701 Nuitka_Frame_members,
702 Nuitka_Frame_tp_getset,
707void _initCompiledFrameType(
void) {
708 assert(Nuitka_Frame_Type.tp_doc != PyFrame_Type.tp_doc || PyFrame_Type.tp_doc == NULL);
709 assert(Nuitka_Frame_Type.tp_traverse != PyFrame_Type.tp_traverse);
710 assert(Nuitka_Frame_Type.tp_clear != PyFrame_Type.tp_clear || PyFrame_Type.tp_clear == NULL);
711 assert(Nuitka_Frame_Type.tp_richcompare != PyFrame_Type.tp_richcompare || PyFrame_Type.tp_richcompare == NULL);
712 assert(Nuitka_Frame_Type.tp_weaklistoffset != PyFrame_Type.tp_weaklistoffset ||
713 PyFrame_Type.tp_weaklistoffset == 0);
714 assert(Nuitka_Frame_Type.tp_iter != PyFrame_Type.tp_iter || PyFrame_Type.tp_iter == NULL);
715 assert(Nuitka_Frame_Type.tp_iternext != PyFrame_Type.tp_iternext || PyFrame_Type.tp_iternext == NULL);
716 assert(Nuitka_Frame_Type.tp_methods != PyFrame_Type.tp_methods);
717 assert(Nuitka_Frame_Type.tp_members != PyFrame_Type.tp_members);
718 assert(Nuitka_Frame_Type.tp_getset != PyFrame_Type.tp_getset);
720 assert(Nuitka_Frame_Type.tp_descr_get != PyFrame_Type.tp_descr_get || PyFrame_Type.tp_descr_get == NULL);
722 assert(Nuitka_Frame_Type.tp_descr_set != PyFrame_Type.tp_descr_set || PyFrame_Type.tp_descr_set == NULL);
723 assert(Nuitka_Frame_Type.tp_dictoffset != PyFrame_Type.tp_dictoffset || PyFrame_Type.tp_dictoffset == 0);
731 assert(Nuitka_Frame_Type.tp_bases != PyFrame_Type.tp_bases);
732 assert(Nuitka_Frame_Type.tp_mro != PyFrame_Type.tp_mro);
733 assert(Nuitka_Frame_Type.tp_cache != PyFrame_Type.tp_cache || PyFrame_Type.tp_cache == NULL);
734 assert(Nuitka_Frame_Type.tp_subclasses != PyFrame_Type.tp_subclasses || PyFrame_Type.tp_cache == NULL);
735 assert(Nuitka_Frame_Type.tp_del != PyFrame_Type.tp_del || PyFrame_Type.tp_del == NULL);
736#if PYTHON_VERSION >= 0x300
737 assert(Nuitka_Frame_Type.tp_finalize != PyFrame_Type.tp_finalize || PyFrame_Type.tp_finalize == NULL);
739 Nuitka_PyType_Ready(&Nuitka_Frame_Type, &PyFrame_Type,
true,
true,
false,
false,
false);
745static struct Nuitka_FrameObject *_MAKE_COMPILED_FRAME(PyCodeObject *code, PyObject *module, PyObject *f_locals,
746 Py_ssize_t locals_size) {
747 CHECK_CODE_OBJECT(code);
748 CHECK_OBJECT(module);
751 count_active_Nuitka_Frame_Type += 1;
752 count_allocated_Nuitka_Frame_Type += 1;
756 CHECK_OBJECT(globals);
758 assert(PyDict_Check(globals));
763 allocateFromFreeList(free_list_frames,
struct Nuitka_FrameObject, Nuitka_Frame_Type, locals_size);
765 result->m_type_description = NULL;
767 PyFrameObject *frame = &result->m_frame;
769#if PYTHON_VERSION < 0x3b0
770 PyFrameObject *locals_owner = frame;
772 _PyInterpreterFrame *locals_owner = &result->m_interpreter_frame;
775#if PYTHON_VERSION < 0x3d0
776 locals_owner->f_code = code;
779 locals_owner->f_executable = (PyObject *)code;
782 frame->f_trace = Py_None;
784#if PYTHON_VERSION < 0x370
785 frame->f_exc_type = NULL;
786 frame->f_exc_value = NULL;
787 frame->f_exc_traceback = NULL;
789 frame->f_trace_lines = 0;
790 frame->f_trace_opcodes = 0;
793#if PYTHON_VERSION >= 0x3b0
794 result->m_ob_size = Py_SIZE(result);
796 frame->f_back = NULL;
798 Py_INCREF(dict_builtin);
799 locals_owner->f_builtins = (PyObject *)dict_builtin;
802 locals_owner->f_globals = globals;
805 CHECK_OBJECT_X(f_locals);
806 locals_owner->f_locals = f_locals;
808#if PYTHON_VERSION < 0x300
809 frame->f_tstate = PyThreadState_GET();
812#if PYTHON_VERSION < 0x3b0
817 frame->f_lineno = code->co_firstlineno;
819#if PYTHON_VERSION >= 0x300
820 Nuitka_SetFrameGenerator(result, NULL);
822 Nuitka_Frame_MarkAsNotExecuting(result);
825#if PYTHON_VERSION >= 0x3b0
826 result->m_interpreter_frame.frame_obj = &result->m_frame;
827 result->m_interpreter_frame.owner = FRAME_OWNED_BY_GENERATOR;
828#if PYTHON_VERSION >= 0x3c0
829 result->m_interpreter_frame.f_funcobj = NULL;
831 result->m_interpreter_frame.f_func = NULL;
833#if PYTHON_VERSION < 0x3d0
834 result->m_interpreter_frame.prev_instr = _PyCode_CODE(code);
836 result->m_interpreter_frame.instr_ptr = _PyCode_CODE(code);
838 result->m_frame.f_frame = &result->m_interpreter_frame;
840 assert(!_PyFrame_IsIncomplete(&result->m_interpreter_frame));
843 Nuitka_GC_Track(result);
851 return _MAKE_COMPILED_FRAME(code, module, f_locals, 0);
854struct Nuitka_FrameObject *MAKE_FUNCTION_FRAME(PyThreadState *tstate, PyCodeObject *code, PyObject *module,
855 Py_ssize_t locals_size) {
858 if (likely((code->co_flags & CO_OPTIMIZED) == CO_OPTIMIZED)) {
861 PyObject *kw_pairs[2] = {const_str_plain___module__, MODULE_NAME0(tstate, module)};
862 f_locals = MAKE_DICT(kw_pairs, 1);
865 return _MAKE_COMPILED_FRAME(code, module, f_locals, locals_size);
868struct Nuitka_FrameObject *MAKE_CLASS_FRAME(PyThreadState *tstate, PyCodeObject *code, PyObject *module,
869 PyObject *f_locals, Py_ssize_t locals_size) {
871 if (f_locals == NULL) {
872 PyObject *kw_pairs[2] = {const_str_plain___module__, MODULE_NAME0(tstate, module)};
873 f_locals = MAKE_DICT(kw_pairs, 1);
878 return _MAKE_COMPILED_FRAME(code, module, f_locals, locals_size);
882PyCodeObject *makeCodeObject(PyObject *filename,
int line,
int flags, PyObject *function_name,
883#
if PYTHON_VERSION >= 0x3b0
884 PyObject *function_qualname,
886 PyObject *arg_names, PyObject *free_vars,
int arg_count
887#
if PYTHON_VERSION >= 0x300
891#
if PYTHON_VERSION >= 0x380
897 if (filename == Py_None) {
898 filename = const_str_empty;
904 CHECK_OBJECT(filename);
905 assert(Nuitka_StringOrUnicode_CheckExact(filename));
907 CHECK_OBJECT(function_name);
908 assert(Nuitka_String_CheckExact(function_name));
910#if PYTHON_VERSION < 0x300
911 PyObject *filename_str = NULL;
915 if (PyUnicode_CheckExact(filename)) {
916 filename_str = PyUnicode_AsUTF8String(filename);
917 filename = filename_str;
919 filename_str = filename;
924 if (arg_names == NULL || arg_names == Py_None) {
925 arg_names = const_tuple_empty;
927 CHECK_OBJECT(arg_names);
928 assert(PyTuple_Check(arg_names));
930 if (free_vars == NULL || free_vars == Py_None) {
931 free_vars = const_tuple_empty;
933 CHECK_OBJECT(free_vars);
934 assert(PyTuple_Check(free_vars));
939#ifndef __NUITKA_NO_ASSERT__
947#if PYTHON_VERSION < 0x300
948 PyObject *code = const_str_empty;
949 PyObject *lnotab = const_str_empty;
950 PyObject *consts = const_tuple_empty;
951 PyObject *names = const_tuple_empty;
953#elif PYTHON_VERSION < 0x3b0
954 PyObject *code = const_bytes_empty;
955 PyObject *lnotab = const_bytes_empty;
956 PyObject *consts = const_tuple_empty;
957 PyObject *names = const_tuple_empty;
962 static PyObject *empty_code = NULL;
963 static PyObject *lnotab = NULL;
964 static PyObject *consts = NULL;
965 static PyObject *names = NULL;
967 static PyObject *exception_table = NULL;
968 static int stacksize = 0;
970 if (empty_code == NULL) {
972 PyThreadState *tstate = PyThreadState_GET();
974 PyObject *empty_code_module_object = Py_CompileString(
975 "def empty(): raise RuntimeError('Compiled function bytecode used')",
"<exec>", Py_file_input);
976 NUITKA_MAY_BE_UNUSED PyObject *
module =
977 PyImport_ExecCodeModule("nuitka_empty_function", empty_code_module_object);
978 CHECK_OBJECT(module);
980 PyObject *empty_function = PyObject_GetAttrString(module,
"empty");
981 CHECK_OBJECT(empty_function);
982 PyObject *empty_code_object = PyObject_GetAttrString(empty_function,
"__code__");
983 CHECK_OBJECT(empty_code_object);
985 NUITKA_MAY_BE_UNUSED
bool bool_res = Nuitka_DelModuleString(tstate,
"nuitka_empty_function");
986 assert(bool_res !=
false);
988 empty_code = PyObject_GetAttrString(empty_code_object,
"co_code");
989 CHECK_OBJECT(empty_code);
990#if PYTHON_VERSION >= 0x3c0
991 lnotab = ((PyCodeObject *)empty_code_object)->co_linetable;
993 lnotab = PyObject_GetAttrString(empty_code_object,
"co_lnotab");
994 CHECK_OBJECT(lnotab);
996 consts = PyObject_GetAttrString(empty_code_object,
"co_consts");
997 CHECK_OBJECT(consts);
998 names = PyObject_GetAttrString(empty_code_object,
"co_names");
1000 exception_table = PyObject_GetAttrString(empty_code_object,
"co_exceptiontable");
1001 CHECK_OBJECT(exception_table);
1003 stacksize = (int)PyLong_AsLong(PyObject_GetAttrString(empty_code_object,
"co_stacksize"));
1006 PyObject *code = empty_code;
1007 CHECK_OBJECT(empty_code);
1008 CHECK_OBJECT(lnotab);
1009 CHECK_OBJECT(consts);
1010 CHECK_OBJECT(names);
1011 CHECK_OBJECT(exception_table);
1015#if PYTHON_VERSION >= 0x3b0
1016 int nlocals = (int)PyTuple_GET_SIZE(arg_names);
1024#if PYTHON_VERSION >= 0x380
1025 PyCodeObject *result = PyCode_NewWithPosOnlyArgs(arg_count,
1027 PyCodeObject *result = PyCode_New(arg_count,
1030#
if PYTHON_VERSION >= 0x300
1031#
if PYTHON_VERSION >= 0x380
1047#
if PYTHON_VERSION >= 0x3b0
1052#
if PYTHON_VERSION >= 0x3b0
1060#if PYTHON_VERSION < 0x300
1061 Py_DECREF(filename_str);
1064 if (result == NULL) {
1066 NUITKA_CANNOT_GET_HERE(
"Failed to create code object");
1072PyCodeObject *USE_CODE_OBJECT(PyThreadState *tstate, PyObject *code_object, PyObject *module_filename_obj) {
1073 assert(PyCode_Check(code_object));
1074 CHECK_OBJECT(module_filename_obj);
1076 PyCodeObject *co = (PyCodeObject *)code_object;
1077 PyObject *old = co->co_filename;
1079 if (old == const_str_empty) {
1082 co->co_filename = Py_NewRef(module_filename_obj);
1084#if PYTHON_VERSION >= 0x3b0
1087 if (co->co_qualname != co->co_name) {
1088 PyObject *w = UNICODE_CONCAT(tstate, co->co_qualname, const_str_dot);
1089 co->co_qualname = UNICODE_CONCAT(tstate, w, co->co_name);
1098void Nuitka_Frame_AttachLocals(
struct Nuitka_FrameObject *frame_object,
char const *type_description, ...) {
1099 assert(Nuitka_Frame_CheckExact((PyObject *)frame_object));
1100 CHECK_OBJECT((PyObject *)frame_object);
1101 assert(_PyObject_GC_IS_TRACKED(frame_object));
1102 assertFrameObject(frame_object);
1105 PRINT_FORMAT(
"Attaching to frame 0x%lx %s\n", frame_object,
1106 Nuitka_String_AsString(PyObject_Repr((PyObject *)Nuitka_Frame_GetCodeObject(&frame_object->m_frame))));
1109 assert(frame_object->m_type_description == NULL);
1114 if (type_description == NULL) {
1115 type_description =
"";
1118 frame_object->m_type_description = type_description;
1120 char const *w = type_description;
1121 char *t = frame_object->m_locals_storage;
1124 va_start(ap, type_description);
1128 case NUITKA_TYPE_DESCRIPTION_OBJECT: {
1129 PyObject *value = va_arg(ap, PyObject *);
1130 memcpy(t, &value,
sizeof(PyObject *));
1132 t +=
sizeof(PyObject *);
1136 case NUITKA_TYPE_DESCRIPTION_OBJECT_PTR: {
1139 PyObject **value = va_arg(ap, PyObject **);
1140 CHECK_OBJECT_X(*value);
1142 memcpy(t, value,
sizeof(PyObject *));
1145 t +=
sizeof(PyObject *);
1149 case NUITKA_TYPE_DESCRIPTION_CELL: {
1151 assert(Nuitka_Cell_Check((PyObject *)value));
1152 CHECK_OBJECT(value);
1153 CHECK_OBJECT_X(value->ob_ref);
1167 case NUITKA_TYPE_DESCRIPTION_NULL: {
1172 case NUITKA_TYPE_DESCRIPTION_BOOL: {
1173 int value = va_arg(ap,
int);
1174 memcpy(t, &value,
sizeof(
int));
1180 case NUITKA_TYPE_DESCRIPTION_NILONG: {
1182 ENFORCE_NILONG_OBJECT_VALUE(&value);
1184 CHECK_OBJECT(value.python_value);
1185 memcpy(t, &value.python_value,
sizeof(PyObject *));
1186 Py_XINCREF(value.python_value);
1187 t +=
sizeof(PyObject *);
1192 NUITKA_CANNOT_GET_HERE(
"invalid type description");
1201 assert(t - frame_object->m_locals_storage <= Nuitka_Frame_GetSize(frame_object));
1206void dumpFrameStack(
void) {
1207 PyThreadState *tstate = PyThreadState_GET();
1210 FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
1214#if PYTHON_VERSION < 0x3b0
1215 PyFrameObject *current = PyThreadState_GET()->frame;
1216 while (current != NULL) {
1218 current = current->f_back;
1221 current = tstate->frame;
1223 _PyCFrame *current = tstate->cframe;
1224 while (current != NULL) {
1226 current = current->previous;
1229 current = tstate->cframe;
1232 PRINT_STRING(
">--------->\n");
1235#if PYTHON_VERSION < 0x3b0
1236 PyObject *current_repr = PyObject_Str((PyObject *)current);
1237 PyObject *code_repr = PyObject_Str((PyObject *)current->f_code);
1239 PyObject *current_repr = NULL;
1240 if (current->current_frame->frame_obj != NULL) {
1241 current_repr = PyObject_Str((PyObject *)current->current_frame->frame_obj);
1243 current_repr = const_str_empty;
1244 Py_INCREF(const_str_empty);
1246 PyObject *code_repr = PyObject_Str((PyObject *)Nuitka_InterpreterFrame_GetCodeObject(current->current_frame));
1249 PRINT_FORMAT(
"Frame stack %d: %s %d %s\n", total--, Nuitka_String_AsString(current_repr), Py_REFCNT(current),
1250 Nuitka_String_AsString(code_repr));
1252 Py_DECREF(current_repr);
1253 Py_DECREF(code_repr);
1255#if PYTHON_VERSION < 0x3b0
1256 current = current->f_back;
1258 current = current->previous;
1262 PRINT_STRING(
">---------<\n");
1264 RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
1267static void PRINT_UNCOMPILED_FRAME(
char const *prefix, PyFrameObject *frame) {
1268 PRINT_STRING(prefix);
1272 PyObject *frame_str = PyObject_Str((PyObject *)frame);
1273 PRINT_ITEM(frame_str);
1274 Py_DECREF(frame_str);
1276 PyObject *code_object_str = PyObject_Repr((PyObject *)Nuitka_Frame_GetCodeObject(frame));
1277 PRINT_ITEM(code_object_str);
1278 Py_DECREF(code_object_str);
1280 PRINT_REFCOUNT((PyObject *)frame);
1282 PRINT_STRING(
"<NULL> no frame");
1289 return PRINT_UNCOMPILED_FRAME(prefix, &frame->m_frame);
1292void PRINT_INTERPRETER_FRAME(
char const *prefix, Nuitka_ThreadStateFrameType *frame) {
1293#if PYTHON_VERSION < 0x3b0
1294 PRINT_UNCOMPILED_FRAME(prefix, frame);
1296 PRINT_STRING(prefix);
1300 PRINT_FORMAT(
"0x%lx ", frame);
1302 PyObject *code_object_str = PyObject_Repr((PyObject *)Nuitka_InterpreterFrame_GetCodeObject(frame));
1303 PRINT_ITEM(code_object_str);
1304 Py_DECREF(code_object_str);
1306 PRINT_STRING(
"<NULL> no frame");
1313void PRINT_TOP_FRAME(
char const *prefix) {
1314 PyThreadState *tstate = PyThreadState_GET();
1316#if PYTHON_VERSION < 0x3b0
1317 PRINT_UNCOMPILED_FRAME(prefix, tstate->frame);
1319 PRINT_INTERPRETER_FRAME(prefix, CURRENT_TSTATE_INTERPRETER_FRAME(tstate));
Definition compiled_cell.h:14
Definition exceptions.h:712
Definition compiled_frame.h:117
Definition compiled_generator.h:41