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;
777#elif PYTHON_VERSION < 0x3e0
778 locals_owner->f_executable = (PyObject *)code;
781 locals_owner->f_executable = _PyStackRef_FromPyObjectNew((PyObject *)code);
784 frame->f_trace = Py_None;
786#if PYTHON_VERSION < 0x370
787 frame->f_exc_type = NULL;
788 frame->f_exc_value = NULL;
789 frame->f_exc_traceback = NULL;
791 frame->f_trace_lines = 0;
792 frame->f_trace_opcodes = 0;
795#if PYTHON_VERSION >= 0x3b0
796 result->m_ob_size = Py_SIZE(result);
798 frame->f_back = NULL;
800 Py_INCREF(dict_builtin);
801 locals_owner->f_builtins = (PyObject *)dict_builtin;
804 locals_owner->f_globals = globals;
807 CHECK_OBJECT_X(f_locals);
808 locals_owner->f_locals = f_locals;
810#if PYTHON_VERSION < 0x300
811 frame->f_tstate = PyThreadState_GET();
814#if PYTHON_VERSION < 0x3b0
819 frame->f_lineno = code->co_firstlineno;
821#if PYTHON_VERSION >= 0x300
822 Nuitka_SetFrameGenerator(result, NULL);
824 Nuitka_Frame_MarkAsNotExecuting(result);
827#if PYTHON_VERSION >= 0x3b0
828 result->m_interpreter_frame.frame_obj = &result->m_frame;
829 result->m_interpreter_frame.owner = FRAME_OWNED_BY_GENERATOR;
830#if PYTHON_VERSION >= 0x3e0
831 result->m_interpreter_frame.f_funcobj = PyStackRef_NULL;
832#elif PYTHON_VERSION >= 0x3c0
833 result->m_interpreter_frame.f_funcobj = NULL;
835 result->m_interpreter_frame.f_func = NULL;
837#if PYTHON_VERSION < 0x3d0
838 result->m_interpreter_frame.prev_instr = _PyCode_CODE(code);
840 result->m_interpreter_frame.instr_ptr = _PyCode_CODE(code);
842 result->m_frame.f_frame = &result->m_interpreter_frame;
844 assert(!_PyFrame_IsIncomplete(&result->m_interpreter_frame));
847 Nuitka_GC_Track(result);
855 return _MAKE_COMPILED_FRAME(code, module, f_locals, 0);
858struct Nuitka_FrameObject *MAKE_FUNCTION_FRAME(PyThreadState *tstate, PyCodeObject *code, PyObject *module,
859 Py_ssize_t locals_size) {
862 if (likely((code->co_flags & CO_OPTIMIZED) == CO_OPTIMIZED)) {
865 PyObject *kw_pairs[2] = {const_str_plain___module__, MODULE_NAME0(tstate, module)};
866 f_locals = MAKE_DICT(kw_pairs, 1);
869 return _MAKE_COMPILED_FRAME(code, module, f_locals, locals_size);
872struct Nuitka_FrameObject *MAKE_CLASS_FRAME(PyThreadState *tstate, PyCodeObject *code, PyObject *module,
873 PyObject *f_locals, Py_ssize_t locals_size) {
875 if (f_locals == NULL) {
876 PyObject *kw_pairs[2] = {const_str_plain___module__, MODULE_NAME0(tstate, module)};
877 f_locals = MAKE_DICT(kw_pairs, 1);
882 return _MAKE_COMPILED_FRAME(code, module, f_locals, locals_size);
886PyCodeObject *makeCodeObject(PyObject *filename,
int line,
int flags, PyObject *function_name,
887#
if PYTHON_VERSION >= 0x3b0
888 PyObject *function_qualname,
890 PyObject *arg_names, PyObject *free_vars,
int arg_count
891#
if PYTHON_VERSION >= 0x300
895#
if PYTHON_VERSION >= 0x380
901 if (filename == Py_None) {
902 filename = const_str_empty;
908 CHECK_OBJECT(filename);
909 assert(Nuitka_StringOrUnicode_CheckExact(filename));
911 CHECK_OBJECT(function_name);
912 assert(Nuitka_String_CheckExact(function_name));
914#if PYTHON_VERSION >= 0x3b0
915 if (function_qualname) {
916 CHECK_OBJECT(function_qualname);
917 PyUnicode_CheckExact(function_qualname);
921#if PYTHON_VERSION >= 0x300
922 assert(kw_only_count >= 0);
924#if PYTHON_VERSION >= 0x380
925 assert(pos_only_count >= 0);
928 assert(arg_count >= 0);
933 if (pos_only_count < 0) abort();
934 if (kw_only_count < 0) abort();
935 if (flags < 0) abort();
936 if (arg_count < 0) abort();
939#if PYTHON_VERSION < 0x300
940 PyObject *filename_str = NULL;
944 if (PyUnicode_CheckExact(filename)) {
945 filename_str = PyUnicode_AsUTF8String(filename);
946 filename = filename_str;
948 filename_str = filename;
953 if (arg_names == NULL || arg_names == Py_None) {
954 arg_names = const_tuple_empty;
956 CHECK_OBJECT(arg_names);
957 assert(PyTuple_Check(arg_names));
959 if (free_vars == NULL || free_vars == Py_None) {
960 free_vars = const_tuple_empty;
962 CHECK_OBJECT(free_vars);
963 assert(PyTuple_Check(free_vars));
968#ifndef __NUITKA_NO_ASSERT__
976#if PYTHON_VERSION < 0x300
977 PyObject *code = const_str_empty;
978 PyObject *lnotab = const_str_empty;
979 PyObject *consts = const_tuple_empty;
980 PyObject *names = const_tuple_empty;
982#elif PYTHON_VERSION < 0x3b0
983 PyObject *code = const_bytes_empty;
984 PyObject *lnotab = const_bytes_empty;
985 PyObject *consts = const_tuple_empty;
986 PyObject *names = const_tuple_empty;
991 static PyObject *empty_code = NULL;
992 static PyObject *lnotab = NULL;
993 static PyObject *consts = NULL;
994 static PyObject *names = NULL;
996 static PyObject *exception_table = NULL;
997 static int stacksize = 0;
999 if (empty_code == NULL) {
1001 PyThreadState *tstate = PyThreadState_GET();
1003 PyObject *empty_code_module_object = Py_CompileString(
1004 "def empty(): raise RuntimeError('Compiled function bytecode used')",
"<exec>", Py_file_input);
1005 NUITKA_MAY_BE_UNUSED PyObject *
module =
1006 PyImport_ExecCodeModule("nuitka_empty_function", empty_code_module_object);
1007 CHECK_OBJECT(module);
1009 PyObject *empty_function = PyObject_GetAttrString(module,
"empty");
1010 CHECK_OBJECT(empty_function);
1011 PyObject *empty_code_object = PyObject_GetAttrString(empty_function,
"__code__");
1012 CHECK_OBJECT(empty_code_object);
1014 NUITKA_MAY_BE_UNUSED
bool bool_res = Nuitka_DelModuleString(tstate,
"nuitka_empty_function");
1015 assert(bool_res !=
false);
1017 empty_code = PyObject_GetAttrString(empty_code_object,
"co_code");
1018 CHECK_OBJECT(empty_code);
1019#if PYTHON_VERSION >= 0x3c0
1020 lnotab = ((PyCodeObject *)empty_code_object)->co_linetable;
1022 lnotab = PyObject_GetAttrString(empty_code_object,
"co_lnotab");
1023 CHECK_OBJECT(lnotab);
1025 consts = PyObject_GetAttrString(empty_code_object,
"co_consts");
1026 CHECK_OBJECT(consts);
1027 names = PyObject_GetAttrString(empty_code_object,
"co_names");
1028 CHECK_OBJECT(names);
1029 exception_table = PyObject_GetAttrString(empty_code_object,
"co_exceptiontable");
1030 CHECK_OBJECT(exception_table);
1032 stacksize = (int)PyLong_AsLong(PyObject_GetAttrString(empty_code_object,
"co_stacksize"));
1035 PyObject *code = empty_code;
1036 CHECK_OBJECT(empty_code);
1037 assert(PyBytes_Check(code));
1038 CHECK_OBJECT(lnotab);
1039 assert(PyBytes_Check(lnotab));
1040 CHECK_OBJECT(consts);
1041 assert(PyTuple_Check(consts));
1042 CHECK_OBJECT(names);
1043 assert(PyTuple_Check(names));
1044 CHECK_OBJECT(exception_table);
1045 assert(PyBytes_Check(exception_table));
1046 assert(stacksize >= 0);
1050#if PYTHON_VERSION >= 0x3b0
1051 int nlocals = (int)PyTuple_GET_SIZE(arg_names);
1059#if PYTHON_VERSION >= 0x380
1060 PyCodeObject *result = PyCode_NewWithPosOnlyArgs(arg_count,
1062 PyCodeObject *result = PyCode_New(arg_count,
1065#
if PYTHON_VERSION >= 0x300
1066#
if PYTHON_VERSION >= 0x380
1082#
if PYTHON_VERSION >= 0x3b0
1087#
if PYTHON_VERSION >= 0x3b0
1095#if PYTHON_VERSION < 0x300
1096 Py_DECREF(filename_str);
1099 if (result == NULL) {
1101 NUITKA_CANNOT_GET_HERE(
"Failed to create code object");
1107PyCodeObject *USE_CODE_OBJECT(PyThreadState *tstate, PyObject *code_object, PyObject *module_filename_obj) {
1108 assert(PyCode_Check(code_object));
1109 CHECK_OBJECT(module_filename_obj);
1111 PyCodeObject *co = (PyCodeObject *)code_object;
1112 PyObject *old = co->co_filename;
1114 if (old == const_str_empty) {
1117 co->co_filename = Py_NewRef(module_filename_obj);
1119#if PYTHON_VERSION >= 0x3b0
1122 if (co->co_qualname != co->co_name) {
1123 PyObject *w = UNICODE_CONCAT(tstate, co->co_qualname, const_str_dot);
1124 co->co_qualname = UNICODE_CONCAT(tstate, w, co->co_name);
1133void Nuitka_Frame_AttachLocals(
struct Nuitka_FrameObject *frame_object,
char const *type_description, ...) {
1134 assert(Nuitka_Frame_CheckExact((PyObject *)frame_object));
1135 CHECK_OBJECT((PyObject *)frame_object);
1136 assert(_PyObject_GC_IS_TRACKED(frame_object));
1137 assertFrameObject(frame_object);
1140 PRINT_FORMAT(
"Attaching to frame 0x%lx %s\n", frame_object,
1141 Nuitka_String_AsString(PyObject_Repr((PyObject *)Nuitka_Frame_GetCodeObject(&frame_object->m_frame))));
1144 assert(frame_object->m_type_description == NULL);
1149 if (type_description == NULL) {
1150 type_description =
"";
1153 frame_object->m_type_description = type_description;
1155 char const *w = type_description;
1156 char *t = frame_object->m_locals_storage;
1159 va_start(ap, type_description);
1163 case NUITKA_TYPE_DESCRIPTION_OBJECT: {
1164 PyObject *value = va_arg(ap, PyObject *);
1165 memcpy(t, &value,
sizeof(PyObject *));
1167 t +=
sizeof(PyObject *);
1171 case NUITKA_TYPE_DESCRIPTION_OBJECT_PTR: {
1174 PyObject **value = va_arg(ap, PyObject **);
1175 CHECK_OBJECT_X(*value);
1177 memcpy(t, value,
sizeof(PyObject *));
1180 t +=
sizeof(PyObject *);
1184 case NUITKA_TYPE_DESCRIPTION_CELL: {
1186 assert(Nuitka_Cell_Check((PyObject *)value));
1187 CHECK_OBJECT(value);
1188 CHECK_OBJECT_X(value->ob_ref);
1202 case NUITKA_TYPE_DESCRIPTION_NULL: {
1207 case NUITKA_TYPE_DESCRIPTION_BOOL: {
1208 int value = va_arg(ap,
int);
1209 memcpy(t, &value,
sizeof(
int));
1215 case NUITKA_TYPE_DESCRIPTION_NILONG: {
1217 ENFORCE_NILONG_OBJECT_VALUE(&value);
1219 CHECK_OBJECT(value.python_value);
1220 memcpy(t, &value.python_value,
sizeof(PyObject *));
1221 Py_XINCREF(value.python_value);
1222 t +=
sizeof(PyObject *);
1227 NUITKA_CANNOT_GET_HERE(
"invalid type description");
1236 assert(t - frame_object->m_locals_storage <= Nuitka_Frame_GetSize(frame_object));
1241void dumpFrameStack(
void) {
1242 PyThreadState *tstate = PyThreadState_GET();
1245 FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
1249#if PYTHON_VERSION < 0x3b0
1250 PyFrameObject *current = PyThreadState_GET()->frame;
1251 while (current != NULL) {
1253 current = current->f_back;
1256 current = tstate->frame;
1258 _PyCFrame *current = tstate->cframe;
1259 while (current != NULL) {
1261 current = current->previous;
1264 current = tstate->cframe;
1267 PRINT_STRING(
">--------->\n");
1270#if PYTHON_VERSION < 0x3b0
1271 PyObject *current_repr = PyObject_Str((PyObject *)current);
1272 PyObject *code_repr = PyObject_Str((PyObject *)current->f_code);
1274 PyObject *current_repr = NULL;
1275 if (current->current_frame->frame_obj != NULL) {
1276 current_repr = PyObject_Str((PyObject *)current->current_frame->frame_obj);
1278 current_repr = const_str_empty;
1279 Py_INCREF(const_str_empty);
1281 PyObject *code_repr = PyObject_Str((PyObject *)Nuitka_InterpreterFrame_GetCodeObject(current->current_frame));
1284 PRINT_FORMAT(
"Frame stack %d: %s %d %s\n", total--, Nuitka_String_AsString(current_repr), Py_REFCNT(current),
1285 Nuitka_String_AsString(code_repr));
1287 Py_DECREF(current_repr);
1288 Py_DECREF(code_repr);
1290#if PYTHON_VERSION < 0x3b0
1291 current = current->f_back;
1293 current = current->previous;
1297 PRINT_STRING(
">---------<\n");
1299 RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
1302static void PRINT_UNCOMPILED_FRAME(
char const *prefix, PyFrameObject *frame) {
1303 PRINT_STRING(prefix);
1307 PyObject *frame_str = PyObject_Str((PyObject *)frame);
1308 PRINT_ITEM(frame_str);
1309 Py_DECREF(frame_str);
1311 PyObject *code_object_str = PyObject_Repr((PyObject *)Nuitka_Frame_GetCodeObject(frame));
1312 PRINT_ITEM(code_object_str);
1313 Py_DECREF(code_object_str);
1315 PRINT_REFCOUNT((PyObject *)frame);
1317 PRINT_STRING(
"<NULL> no frame");
1324 return PRINT_UNCOMPILED_FRAME(prefix, &frame->m_frame);
1327void PRINT_INTERPRETER_FRAME(
char const *prefix, Nuitka_ThreadStateFrameType *frame) {
1328#if PYTHON_VERSION < 0x3b0
1329 PRINT_UNCOMPILED_FRAME(prefix, frame);
1331 PRINT_STRING(prefix);
1335 PRINT_FORMAT(
"0x%lx ", frame);
1337 PyObject *code_object_str = PyObject_Repr((PyObject *)Nuitka_InterpreterFrame_GetCodeObject(frame));
1338 PRINT_ITEM(code_object_str);
1339 Py_DECREF(code_object_str);
1341 PRINT_STRING(
"<NULL> no frame");
1348void PRINT_TOP_FRAME(
char const *prefix) {
1349 PyThreadState *tstate = PyThreadState_GET();
1351#if PYTHON_VERSION < 0x3b0
1352 PRINT_UNCOMPILED_FRAME(prefix, tstate->frame);
1354 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