13#include "nuitka/prelude.h"
15#include "HelpersBuiltinTypeMethods.c"
17static void _initBuiltinTypeMethods(
void) {
18#if PYTHON_VERSION < 0x300
19 NUITKA_PRINT_TRACE(
"main(): Calling _initStrBuiltinMethods().");
20 _initStrBuiltinMethods();
22 NUITKA_PRINT_TRACE(
"main(): Calling _initBytesBuiltinMethods().");
23 _initBytesBuiltinMethods();
25 NUITKA_PRINT_TRACE(
"main(): Calling _initUnicodeBuiltinMethods().");
26 _initUnicodeBuiltinMethods();
27 NUITKA_PRINT_TRACE(
"main(): Calling _initDictBuiltinMethods().");
28 _initDictBuiltinMethods();
29 NUITKA_PRINT_TRACE(
"main(): Calling _initListBuiltinMethods().");
30 _initListBuiltinMethods();
33#if PYTHON_VERSION >= 0x350
34#include "HelpersAllocator.c"
37#include "HelpersBuiltin.c"
38#include "HelpersBytes.c"
39#include "HelpersClasses.c"
40#include "HelpersDictionaries.c"
41#include "HelpersExceptions.c"
42#include "HelpersFiles.c"
43#include "HelpersFloats.c"
44#include "HelpersHeapStorage.c"
45#include "HelpersImport.c"
46#include "HelpersImportHard.c"
47#include "HelpersLists.c"
48#include "HelpersMappings.c"
49#include "HelpersRaising.c"
50#include "HelpersSequences.c"
51#include "HelpersSlices.c"
52#include "HelpersStrings.c"
53#include "HelpersTuples.c"
55#include "HelpersEnvironmentVariables.c"
56#include "HelpersFilesystemPaths.c"
57#include "HelpersSafeStrings.c"
59#if PYTHON_VERSION >= 0x3a0
60#include "HelpersMatching.c"
63#if PYTHON_VERSION < 0x300
65static Py_ssize_t ESTIMATE_RANGE(
long low,
long high,
long step) {
69 return (high - low - 1) / step + 1;
73static PyObject *_BUILTIN_RANGE_INT3(
long low,
long high,
long step) {
79 size = ESTIMATE_RANGE(low, high, step);
81 size = ESTIMATE_RANGE(high, low, -step);
84 PyObject *result = MAKE_LIST_EMPTY(tstate, size);
88 for (
int i = 0; i < size; i++) {
89 PyList_SET_ITEM(result, i, Nuitka_PyInt_FromLong(current));
96static PyObject *_BUILTIN_RANGE_INT2(
long low,
long high) {
return _BUILTIN_RANGE_INT3(low, high, 1); }
98static PyObject *_BUILTIN_RANGE_INT(
long boundary) {
99 PyObject *result = MAKE_LIST_EMPTY(tstate, boundary > 0 ? boundary : 0);
101 for (
int i = 0; i < boundary; i++) {
102 PyList_SET_ITEM(result, i, Nuitka_PyInt_FromLong(i));
108static PyObject *TO_RANGE_ARG(PyObject *value,
char const *name) {
109 if (likely(PyInt_Check(value) || PyLong_Check(value))) {
114 PyTypeObject *type = Py_TYPE(value);
115 PyNumberMethods *tp_as_number = type->tp_as_number;
119#
if PYTHON_VERSION >= 0x270
120 PyFloat_Check(value) ||
122 tp_as_number == NULL || tp_as_number->nb_int == NULL) {
123 PyErr_Format(PyExc_TypeError,
"range() integer %s argument expected, got %s.", name, type->tp_name);
127 PyObject *result = tp_as_number->nb_int(value);
129 if (unlikely(result == NULL)) {
137#if PYTHON_VERSION < 0x300
139NUITKA_DEFINE_BUILTIN(range);
141PyObject *BUILTIN_RANGE(PyThreadState *tstate, PyObject *boundary) {
142 PyObject *boundary_temp = TO_RANGE_ARG(boundary,
"end");
144 if (unlikely(boundary_temp == NULL)) {
148 long start = PyInt_AsLong(boundary_temp);
150 if (start == -1 && DROP_ERROR_OCCURRED(tstate)) {
151 NUITKA_ASSIGN_BUILTIN(range);
153 PyObject *result = CALL_FUNCTION_WITH_SINGLE_ARG(tstate, NUITKA_ACCESS_BUILTIN(range), boundary_temp);
155 Py_DECREF(boundary_temp);
159 Py_DECREF(boundary_temp);
161 return _BUILTIN_RANGE_INT(start);
164PyObject *BUILTIN_RANGE2(PyThreadState *tstate, PyObject *low, PyObject *high) {
165 PyObject *low_temp = TO_RANGE_ARG(low,
"start");
167 if (unlikely(low_temp == NULL)) {
171 PyObject *high_temp = TO_RANGE_ARG(high,
"end");
173 if (unlikely(high_temp == NULL)) {
178 bool fallback =
false;
180 long start = PyInt_AsLong(low_temp);
182 if (unlikely(start == -1 && DROP_ERROR_OCCURRED(tstate))) {
186 long end = PyInt_AsLong(high_temp);
188 if (unlikely(end == -1 && DROP_ERROR_OCCURRED(tstate))) {
194 PyObject *pos_args = MAKE_TUPLE2_0(tstate, low_temp, high_temp);
195 NUITKA_ASSIGN_BUILTIN(range);
197 PyObject *result = CALL_FUNCTION_WITH_POS_ARGS2(tstate, NUITKA_ACCESS_BUILTIN(range), pos_args);
204 Py_DECREF(high_temp);
206 return _BUILTIN_RANGE_INT2(start, end);
210PyObject *BUILTIN_RANGE3(PyThreadState *tstate, PyObject *low, PyObject *high, PyObject *step) {
211 PyObject *low_temp = TO_RANGE_ARG(low,
"start");
213 if (unlikely(low_temp == NULL)) {
217 PyObject *high_temp = TO_RANGE_ARG(high,
"end");
219 if (unlikely(high_temp == NULL)) {
224 PyObject *step_temp = TO_RANGE_ARG(step,
"step");
226 if (unlikely(high_temp == NULL)) {
228 Py_DECREF(high_temp);
232 bool fallback =
false;
234 long start = PyInt_AsLong(low_temp);
236 if (unlikely(start == -1 && DROP_ERROR_OCCURRED(tstate))) {
240 long end = PyInt_AsLong(high_temp);
242 if (unlikely(end == -1 && DROP_ERROR_OCCURRED(tstate))) {
246 long step_long = PyInt_AsLong(step_temp);
248 if (unlikely(step_long == -1 && DROP_ERROR_OCCURRED(tstate))) {
253 PyObject *pos_args = MAKE_TUPLE3_0(tstate, low_temp, high_temp, step_temp);
255 NUITKA_ASSIGN_BUILTIN(range);
257 PyObject *result = CALL_FUNCTION_WITH_POS_ARGS3(tstate, NUITKA_ACCESS_BUILTIN(range), pos_args);
264 Py_DECREF(high_temp);
265 Py_DECREF(step_temp);
267 if (unlikely(step_long == 0)) {
268 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ValueError,
"range() step argument must not be zero");
272 return _BUILTIN_RANGE_INT3(start, end, step_long);
278#if PYTHON_VERSION < 0x300
281static unsigned long getLengthOfRange(PyThreadState *tstate,
long lo,
long hi,
long step) {
284 if (step > 0 && lo < hi) {
285 return 1UL + (hi - 1UL - lo) / step;
286 }
else if (step < 0 && lo > hi) {
287 return 1UL + (lo - 1UL - hi) / (0UL - step);
294PyObject *MAKE_XRANGE(PyThreadState *tstate,
long start,
long stop,
long step) {
296 unsigned long n = getLengthOfRange(tstate, start, stop, step);
298#if defined(__clang__)
299#pragma clang diagnostic push
300#pragma clang diagnostic ignored "-Wtautological-constant-out-of-range-compare"
302 if (n > (
unsigned long)LONG_MAX || (
long)n > PY_SSIZE_T_MAX) {
303#if defined(__clang__)
304#pragma clang diagnostic pop
306 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_OverflowError,
"xrange() result has too many items");
314 assert(result != NULL);
316 result->start = start;
317 result->len = (long)n;
320 return (PyObject *)result;
326static PyObject *getLengthOfRange(PyThreadState *tstate, PyObject *start, PyObject *stop, PyObject *step) {
327 nuitka_bool nbool_res = RICH_COMPARE_GT_NBOOL_OBJECT_LONG(step, const_int_0);
329 if (unlikely(nbool_res == NUITKA_BOOL_EXCEPTION)) {
336 if (nbool_res == NUITKA_BOOL_TRUE) {
345 step = PyNumber_Negative(step);
347 if (unlikely(step == NULL)) {
351 nbool_res = RICH_COMPARE_EQ_NBOOL_OBJECT_LONG(step, const_int_0);
353 if (unlikely(nbool_res == NUITKA_BOOL_EXCEPTION)) {
358 if (unlikely(nbool_res == NUITKA_BOOL_TRUE)) {
359 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ValueError,
"range() arg 3 must not be zero");
367 nbool_res = RICH_COMPARE_GE_NBOOL_OBJECT_OBJECT(lo, hi);
370 if (nbool_res != NUITKA_BOOL_FALSE) {
373 if (unlikely(nbool_res == NUITKA_BOOL_EXCEPTION)) {
377 Py_INCREF(const_int_0);
382 PyObject *tmp1 = PyNumber_Subtract(hi, lo);
384 if (unlikely(tmp1 == NULL)) {
390 PyObject *diff = PyNumber_Subtract(tmp1, const_int_pos_1);
393 if (unlikely(diff == NULL)) {
399 tmp1 = PyNumber_FloorDivide(diff, step);
403 if (unlikely(tmp1 == NULL)) {
407 PyObject *result = PyNumber_Add(tmp1, const_int_pos_1);
413static PyObject *MAKE_XRANGE(PyThreadState *tstate, PyObject *start, PyObject *stop, PyObject *step) {
414 start = Nuitka_Number_IndexAsLong(start);
415 if (unlikely(start == NULL)) {
418 stop = Nuitka_Number_IndexAsLong(stop);
419 if (unlikely(stop == NULL)) {
422 step = Nuitka_Number_IndexAsLong(step);
423 if (unlikely(step == NULL)) {
427 PyObject *length = getLengthOfRange(tstate, start, stop, step);
428 if (unlikely(length == NULL)) {
432 struct _rangeobject3 *result = (
struct _rangeobject3 *)PyObject_New(
struct _rangeobject3, &PyRange_Type);
433 assert(result != NULL);
435 result->start = start;
438 result->length = length;
440 return (PyObject *)result;
445PyObject *BUILTIN_XRANGE1(PyThreadState *tstate, PyObject *high) {
446#if PYTHON_VERSION < 0x300
447 if (unlikely(PyFloat_Check(high))) {
448 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
"integer argument expected, got float");
453 long int_high = PyInt_AsLong(high);
455 if (unlikely(int_high == -1 && HAS_ERROR_OCCURRED(tstate))) {
459 return MAKE_XRANGE(tstate, 0, int_high, 1);
461 PyObject *stop = Nuitka_Number_IndexAsLong(high);
463 if (unlikely(stop == NULL)) {
467 PyObject *length = getLengthOfRange(tstate, const_int_0, stop, const_int_pos_1);
468 if (unlikely(length == NULL)) {
474 struct _rangeobject3 *result = (
struct _rangeobject3 *)PyObject_New(
struct _rangeobject3, &PyRange_Type);
475 assert(result != NULL);
477 result->start = const_int_0;
478 Py_INCREF(const_int_0);
480 result->step = const_int_pos_1;
481 Py_INCREF(const_int_pos_1);
483 result->length = length;
485 return (PyObject *)result;
490PyObject *BUILTIN_XRANGE2(PyThreadState *tstate, PyObject *low, PyObject *high) {
491#if PYTHON_VERSION < 0x300
492 if (unlikely(PyFloat_Check(low))) {
493 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
"integer argument expected, got float");
498 long int_low = PyInt_AsLong(low);
500 if (unlikely(int_low == -1 && HAS_ERROR_OCCURRED(tstate))) {
504 if (unlikely(PyFloat_Check(high))) {
505 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
"integer argument expected, got float");
510 long int_high = PyInt_AsLong(high);
512 if (unlikely(int_high == -1 && HAS_ERROR_OCCURRED(tstate))) {
516 return MAKE_XRANGE(tstate, int_low, int_high, 1);
518 return MAKE_XRANGE(tstate, low, high, const_int_pos_1);
523PyObject *BUILTIN_XRANGE3(PyThreadState *tstate, PyObject *low, PyObject *high, PyObject *step) {
524#if PYTHON_VERSION < 0x300
525 if (unlikely(PyFloat_Check(low))) {
526 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
"integer argument expected, got float");
531 long int_low = PyInt_AsLong(low);
533 if (unlikely(int_low == -1 && HAS_ERROR_OCCURRED(tstate))) {
537 if (unlikely(PyFloat_Check(high))) {
538 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
"integer argument expected, got float");
543 long int_high = PyInt_AsLong(high);
545 if (unlikely(int_high == -1 && HAS_ERROR_OCCURRED(tstate))) {
549 if (unlikely(PyFloat_Check(step))) {
550 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
"integer argument expected, got float");
555 long int_step = PyInt_AsLong(step);
557 if (unlikely(int_step == -1 && HAS_ERROR_OCCURRED(tstate))) {
561 if (unlikely(int_step == 0)) {
562 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ValueError,
"range() arg 3 must not be zero");
567 return MAKE_XRANGE(tstate, int_low, int_high, int_step);
569 return MAKE_XRANGE(tstate, low, high, step);
573PyObject *BUILTIN_ALL(PyThreadState *tstate, PyObject *value) {
576 PyObject *it = PyObject_GetIter(value);
578 if (unlikely((it == NULL))) {
582 iternextfunc iternext = Py_TYPE(it)->tp_iternext;
584 PyObject *item = iternext(it);
586 if (unlikely((item == NULL)))
588 int cmp = PyObject_IsTrue(item);
590 if (unlikely(cmp < 0)) {
597 Py_INCREF_IMMORTAL(Py_False);
604 if (unlikely(!CHECK_AND_CLEAR_STOP_ITERATION_OCCURRED(tstate))) {
608 Py_INCREF_IMMORTAL(Py_True);
612PyObject *BUILTIN_LEN(PyThreadState *tstate, PyObject *value) {
615 Py_ssize_t res = Nuitka_PyObject_Size(value);
617 if (unlikely(res < 0 && HAS_ERROR_OCCURRED(tstate))) {
621 return PyInt_FromSsize_t(res);
624PyObject *BUILTIN_ANY(PyThreadState *tstate, PyObject *value) {
627 PyObject *it = PyObject_GetIter(value);
629 if (unlikely((it == NULL))) {
633 iternextfunc iternext = Py_TYPE(it)->tp_iternext;
635 PyObject *item = iternext(it);
637 if (unlikely((item == NULL)))
639 int cmp = PyObject_IsTrue(item);
641 if (unlikely(cmp < 0)) {
647 Py_INCREF_IMMORTAL(Py_True);
653 if (unlikely(!CHECK_AND_CLEAR_STOP_ITERATION_OCCURRED(tstate))) {
657 Py_INCREF_IMMORTAL(Py_False);
661PyObject *BUILTIN_ABS(PyObject *o) {
664 PyNumberMethods *m = o->ob_type->tp_as_number;
665 if (likely(m && m->nb_absolute)) {
666 return m->nb_absolute(o);
669 return PyErr_Format(PyExc_TypeError,
"bad operand type for abs(): '%s'", Py_TYPE(o)->tp_name);
672NUITKA_DEFINE_BUILTIN(format);
674PyObject *BUILTIN_FORMAT(PyThreadState *tstate, PyObject *value, PyObject *format_spec) {
676 CHECK_OBJECT(format_spec);
678 NUITKA_ASSIGN_BUILTIN(format);
680 PyObject *args[2] = {value, format_spec};
682 return CALL_FUNCTION_WITH_ARGS2(tstate, NUITKA_ACCESS_BUILTIN(format), args);
688#if PYTHON_VERSION >= 0x300
689NUITKA_DEFINE_BUILTIN(print);
692bool PRINT_NEW_LINE_TO(PyObject *file) {
693 PyThreadState *tstate = PyThreadState_GET();
695#if PYTHON_VERSION < 0x300
696 if (file == NULL || file == Py_None) {
699 if (unlikely(file == NULL)) {
700 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError,
"lost sys.stdout");
709 if (unlikely(PyFile_WriteString(
"\n", file) == -1)) {
714 PyFile_SoftSpace(file, 0);
720 NUITKA_ASSIGN_BUILTIN(print);
724 FETCH_ERROR_OCCURRED_STATE_UNTRACED(tstate, &saved_exception_state);
728 if (likely(file == NULL)) {
729 result = CALL_FUNCTION_NO_ARGS(tstate, NUITKA_ACCESS_BUILTIN(print));
731 PyObject *kw_pairs[2] = {const_str_plain_file, GET_STDOUT()};
732 PyObject *kw_args = MAKE_DICT(kw_pairs, 1);
736 result = CALL_FUNCTION_WITH_KW_ARGS(tstate, NUITKA_ACCESS_BUILTIN(print), kw_args);
743 RESTORE_ERROR_OCCURRED_STATE_UNTRACED(tstate, &saved_exception_state);
745 return result != NULL;
749bool PRINT_ITEM_TO(PyObject *file, PyObject *
object) {
750 PyThreadState *tstate = PyThreadState_GET();
754#if PYTHON_VERSION < 0x300
755 if (file == NULL || file == Py_None) {
758 if (unlikely(file == NULL)) {
759 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError,
"lost sys.stdout");
765 CHECK_OBJECT(
object);
772 if (PyFile_SoftSpace(file, 0)) {
773 if (unlikely(PyFile_WriteString(
" ", file) == -1)) {
779 if (unlikely(PyFile_WriteObject(
object, file, Py_PRINT_RAW) == -1)) {
784 if (PyString_Check(
object)) {
788#ifndef __NUITKA_NO_ASSERT__
791 PyString_AsStringAndSize(
object, &buffer, &length);
792 assert(status != -1);
794 if (length == 0 || !isspace(Py_CHARMASK(buffer[length - 1])) || buffer[length - 1] ==
' ') {
795 PyFile_SoftSpace(file, 1);
797 }
else if (PyUnicode_Check(
object)) {
798 Py_UNICODE *buffer = PyUnicode_AS_UNICODE(
object);
799 Py_ssize_t length = PyUnicode_GET_SIZE(
object);
801 if (length == 0 || !Py_UNICODE_ISSPACE(buffer[length - 1]) || buffer[length - 1] ==
' ') {
802 PyFile_SoftSpace(file, 1);
805 PyFile_SoftSpace(file, 1);
813 NUITKA_ASSIGN_BUILTIN(print);
817 FETCH_ERROR_OCCURRED_STATE_UNTRACED(tstate, &saved_exception_state);
820 PyObject *print_kw = MAKE_DICT_EMPTY(tstate);
821 DICT_SET_ITEM(print_kw, const_str_plain_end, const_str_empty);
824 DICT_SET_ITEM(print_kw, const_str_plain_file, GET_STDOUT());
826 DICT_SET_ITEM(print_kw, const_str_plain_file, file);
829 PyObject *print_args = MAKE_TUPLE1(tstate,
object);
831 PyObject *result = CALL_FUNCTION(tstate, NUITKA_ACCESS_BUILTIN(print), print_args, print_kw);
833 Py_DECREF(print_args);
838 RESTORE_ERROR_OCCURRED_STATE_UNTRACED(tstate, &saved_exception_state);
840 return result != NULL;
844void PRINT_REFCOUNT(PyObject *
object) {
846#if PYTHON_VERSION >= 0x3c0
847 if (_Py_IsImmortal(
object)) {
848 PRINT_STRING(
" refcnt IMMORTAL");
853 snprintf(buffer,
sizeof(buffer) - 1,
" refcnt %" PY_FORMAT_SIZE_T
"d ", Py_REFCNT(
object));
855 PRINT_STRING(buffer);
857 PRINT_STRING(
" <null>");
861bool PRINT_STRING(
char const *str) {
863 PyObject *tmp = PyUnicode_FromString(str);
864 bool res = PRINT_ITEM(tmp);
868 return PRINT_STRING(
"<nullstr>");
872bool PRINT_STRING_W(
wchar_t const *str) {
874 PyObject *tmp = NuitkaUnicode_FromWideChar(str, -1);
875 bool res = PRINT_ITEM(tmp);
879 return PRINT_STRING(
"<nullstr>");
883bool PRINT_FORMAT(
char const *fmt, ...) {
890 vsprintf(buffer, fmt, args);
893 return PRINT_STRING(buffer);
896bool PRINT_REPR(PyObject *
object) {
897 PyThreadState *tstate = PyThreadState_GET();
901 FETCH_ERROR_OCCURRED_STATE_UNTRACED(tstate, &saved_exception_state);
905 if (
object != NULL) {
906 CHECK_OBJECT(
object);
910 PyObject *repr = PyObject_Repr(
object);
912 res = PRINT_ITEM(repr);
918 RESTORE_ERROR_OCCURRED_STATE_UNTRACED(tstate, &saved_exception_state);
923bool PRINT_NULL(
void) {
return PRINT_STRING(
"<NULL>"); }
925bool PRINT_TYPE(PyObject *
object) {
return PRINT_ITEM((PyObject *)Py_TYPE(
object)); }
927void _PRINT_EXCEPTION3(PyObject *exception_type, PyObject *exception_value, PyTracebackObject *exception_tb) {
928 PRINT_REPR(exception_type);
929 if (exception_type != NULL) {
930 PRINT_REFCOUNT(exception_type);
933 PRINT_REPR(exception_value);
934 if (exception_value != NULL) {
935 PRINT_REFCOUNT(exception_value);
937#if PYTHON_VERSION >= 0x300
938 if (exception_value != NULL && PyExceptionInstance_Check(exception_value)) {
939 PRINT_STRING(
" <- context ");
940 PyObject *context = Nuitka_Exception_GetContext(exception_value);
945 PRINT_REPR((PyObject *)exception_tb);
946 if (exception_tb != NULL) {
947 PRINT_REFCOUNT((PyObject *)exception_tb);
953#if PYTHON_VERSION >= 0x3b0
954void _PRINT_EXCEPTION1(PyObject *exception_value) {
955 PyObject *exception_type = exception_value ? PyExceptionInstance_Class(exception_value) : NULL;
956 PyTracebackObject *exception_tb = (exception_value && PyExceptionInstance_Check(exception_value))
957 ? GET_EXCEPTION_TRACEBACK(exception_value)
960 _PRINT_EXCEPTION3(exception_type, exception_value, exception_tb);
964void PRINT_CURRENT_EXCEPTION(
void) {
965 PyThreadState *tstate = PyThreadState_GET();
967 PRINT_STRING(
"current_exc=");
968#if PYTHON_VERSION < 0x3c0
969 PRINT_EXCEPTION(tstate->curexc_type, tstate->curexc_value, (PyTracebackObject *)tstate->curexc_traceback);
971 _PRINT_EXCEPTION1(tstate->current_exception);
975void PRINT_PUBLISHED_EXCEPTION(
void) {
976 PyThreadState *tstate = PyThreadState_GET();
978 PRINT_STRING(
"thread_exc=");
979#if PYTHON_VERSION < 0x3b0
980 PRINT_EXCEPTION(EXC_TYPE(tstate), EXC_VALUE(tstate), EXC_TRACEBACK(tstate));
982 PyObject *exc_value = EXC_VALUE(tstate);
983#if PYTHON_VERSION < 0x3c0
984 PyTracebackObject *exc_tb = (exc_value != NULL && exc_value != Py_None) ? GET_EXCEPTION_TRACEBACK(exc_value) : NULL;
986 PRINT_EXCEPTION(EXC_TYPE(tstate), exc_value, exc_tb);
992#if PYTHON_VERSION < 0x300
993void PRINT_TRACEBACK(PyTracebackObject *traceback) {
994 PRINT_STRING(
"Dumping traceback:\n");
996 if (traceback == NULL)
997 PRINT_STRING(
"<NULL traceback?!>\n");
999 while (traceback != NULL) {
1000 printf(
" line %d (frame object chain):\n", traceback->tb_lineno);
1002 PyFrameObject *frame = traceback->tb_frame;
1004 while (frame != NULL) {
1005 printf(
" Frame at %s\n", PyString_AsString(PyObject_Str((PyObject *)Nuitka_Frame_GetCodeObject(frame))));
1007 frame = frame->f_back;
1010 assert(traceback->tb_next != traceback);
1011 traceback = traceback->tb_next;
1014 PRINT_STRING(
"End of Dump.\n");
1018PyObject *GET_STDOUT(
void) {
1019 PyObject *result = Nuitka_SysGetObject(
"stdout");
1021 if (unlikely(result == NULL)) {
1022 PyThreadState *tstate = PyThreadState_GET();
1024 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError,
"lost sys.stdout");
1031PyObject *GET_STDERR(
void) {
1032 PyObject *result = Nuitka_SysGetObject(
"stderr");
1034 if (unlikely(result == NULL)) {
1035 PyThreadState *tstate = PyThreadState_GET();
1037 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError,
"lost sys.stderr");
1044void FLUSH_STDOUT(
void) {
1045 PyObject *stdout_handle = GET_STDOUT();
1047 PyObject *method = PyObject_GetAttrString(stdout_handle,
"flush");
1049 PyThreadState *tstate = PyThreadState_GET();
1050 PyObject *result = CALL_FUNCTION_NO_ARGS(tstate, method);
1055void FLUSH_STDERR(
void) {
1056 PyObject *stderr_handle = GET_STDERR();
1058 PyObject *method = PyObject_GetAttrString(stderr_handle,
"flush");
1060 PyThreadState *tstate = PyThreadState_GET();
1061 PyObject *result = CALL_FUNCTION_NO_ARGS(tstate, method);
1066bool PRINT_NEW_LINE(
void) {
return PRINT_NEW_LINE_TO(NULL); }
1068bool PRINT_ITEM(PyObject *
object) {
1069 if (
object == NULL) {
1070 return PRINT_NULL();
1072 return PRINT_ITEM_TO(NULL,
object);
1076bool PRINT_ITEM_LINE(PyObject *
object) {
return PRINT_ITEM(
object) && PRINT_NEW_LINE(); }
1078#if PYTHON_VERSION < 0x300
1080static void set_slot(PyObject **slot, PyObject *value) {
1081 PyObject *temp = *slot;
1087static void set_attr_slots(PyClassObject *class_object) {
1088 set_slot(&class_object->cl_getattr, FIND_ATTRIBUTE_IN_CLASS(class_object, const_str_plain___getattr__));
1089 set_slot(&class_object->cl_setattr, FIND_ATTRIBUTE_IN_CLASS(class_object, const_str_plain___setattr__));
1090 set_slot(&class_object->cl_delattr, FIND_ATTRIBUTE_IN_CLASS(class_object, const_str_plain___delattr__));
1093static bool set_dict(PyClassObject *class_object, PyObject *value) {
1094 if (value == NULL || !PyDict_Check(value)) {
1095 PyThreadState *tstate = PyThreadState_GET();
1096 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
"__dict__ must be a dictionary object");
1099 set_slot(&class_object->cl_dict, value);
1100 set_attr_slots(class_object);
1106static bool set_bases(PyClassObject *class_object, PyObject *value) {
1107 if (value == NULL || !PyTuple_Check(value)) {
1109 PyThreadState *tstate = PyThreadState_GET();
1111 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
"__bases__ must be a tuple object");
1114 Py_ssize_t n = PyTuple_GET_SIZE(value);
1116 for (Py_ssize_t i = 0; i < n; i++) {
1117 PyObject *base = PyTuple_GET_ITEM(value, i);
1119 if (unlikely(!PyClass_Check(base))) {
1120 PyThreadState *tstate = PyThreadState_GET();
1122 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
"__bases__ items must be classes");
1126 if (unlikely(PyClass_IsSubclass(base, (PyObject *)class_object))) {
1127 PyThreadState *tstate = PyThreadState_GET();
1129 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
1130 "a __bases__ item causes an inheritance cycle");
1135 set_slot(&class_object->cl_bases, value);
1136 set_attr_slots(class_object);
1142static bool set_name(PyClassObject *class_object, PyObject *value) {
1143 if (value == NULL || !PyDict_Check(value)) {
1144 PyThreadState *tstate = PyThreadState_GET();
1146 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
"__name__ must be a string object");
1150 if (strlen(PyString_AS_STRING(value)) != (
size_t)PyString_GET_SIZE(value)) {
1151 PyThreadState *tstate = PyThreadState_GET();
1153 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
"__name__ must not contain null bytes");
1157 set_slot(&class_object->cl_name, value);
1161static int nuitka_class_setattr(PyClassObject *class_object, PyObject *attr_name, PyObject *value) {
1162 char const *sattr_name = PyString_AsString(attr_name);
1164 if (sattr_name[0] ==
'_' && sattr_name[1] ==
'_') {
1165 Py_ssize_t n = PyString_Size(attr_name);
1167 if (sattr_name[n - 2] ==
'_' && sattr_name[n - 1] ==
'_') {
1168 if (strcmp(sattr_name,
"__dict__") == 0) {
1169 if (set_dict(class_object, value) ==
false) {
1174 }
else if (strcmp(sattr_name,
"__bases__") == 0) {
1175 if (set_bases(class_object, value) ==
false) {
1180 }
else if (strcmp(sattr_name,
"__name__") == 0) {
1181 if (set_name(class_object, value) ==
false) {
1186 }
else if (strcmp(sattr_name,
"__getattr__") == 0) {
1187 set_slot(&class_object->cl_getattr, value);
1188 }
else if (strcmp(sattr_name,
"__setattr__") == 0) {
1189 set_slot(&class_object->cl_setattr, value);
1190 }
else if (strcmp(sattr_name,
"__delattr__") == 0) {
1191 set_slot(&class_object->cl_delattr, value);
1196 if (value == NULL) {
1197 int status = DICT_REMOVE_ITEM(class_object->cl_dict, attr_name);
1200 PyErr_Format(PyExc_AttributeError,
"class %s has no attribute '%s'",
1201 PyString_AS_STRING(class_object->cl_name), sattr_name);
1206 return DICT_SET_ITEM(class_object->cl_dict, attr_name, value) ? 0 : -1;
1210static PyObject *nuitka_class_getattr(PyClassObject *class_object, PyObject *attr_name) {
1211 char const *sattr_name = PyString_AsString(attr_name);
1213 if (sattr_name[0] ==
'_' && sattr_name[1] ==
'_') {
1214 if (strcmp(sattr_name,
"__dict__") == 0) {
1215 Py_INCREF(class_object->cl_dict);
1216 return class_object->cl_dict;
1217 }
else if (strcmp(sattr_name,
"__bases__") == 0) {
1218 Py_INCREF(class_object->cl_bases);
1219 return class_object->cl_bases;
1220 }
else if (strcmp(sattr_name,
"__name__") == 0) {
1221 if (class_object->cl_name == NULL) {
1222 Py_INCREF_IMMORTAL(Py_None);
1225 Py_INCREF(class_object->cl_name);
1226 return class_object->cl_name;
1231 PyObject *value = FIND_ATTRIBUTE_IN_CLASS(class_object, attr_name);
1233 if (unlikely(value == NULL)) {
1234 PyErr_Format(PyExc_AttributeError,
"class %s has no attribute '%s'", PyString_AS_STRING(class_object->cl_name),
1239 PyTypeObject *type = Py_TYPE(value);
1241 descrgetfunc tp_descr_get = NuitkaType_HasFeatureClass(type) ? type->tp_descr_get : NULL;
1243 if (tp_descr_get == NULL) {
1247 return tp_descr_get(value, (PyObject *)NULL, (PyObject *)class_object);
1253void enhancePythonTypes(
void) {
1254#if PYTHON_VERSION < 0x300
1257 PyClass_Type.tp_setattro = (setattrofunc)nuitka_class_setattr;
1258 PyClass_Type.tp_getattro = (getattrofunc)nuitka_class_getattr;
1263#include <floatingpoint.h>
1266#define ITERATOR_GENERIC 0
1267#define ITERATOR_COMPILED_GENERATOR 1
1268#define ITERATOR_TUPLE 2
1269#define ITERATOR_LIST 3
1283 PyTupleObject *tuple;
1284 Py_ssize_t tuple_index;
1290 Py_ssize_t list_index;
1295static bool MAKE_QUICK_ITERATOR(PyThreadState *tstate, PyObject *sequence,
struct Nuitka_QuickIterator *qiter) {
1296 if (Nuitka_Generator_Check(sequence)) {
1297 qiter->iterator_mode = ITERATOR_COMPILED_GENERATOR;
1299 }
else if (PyTuple_CheckExact(sequence)) {
1300 qiter->iterator_mode = ITERATOR_TUPLE;
1301 qiter->iterator_data.tuple_data.tuple = (PyTupleObject *)sequence;
1302 qiter->iterator_data.tuple_data.tuple_index = 0;
1303 }
else if (PyList_CheckExact(sequence)) {
1304 qiter->iterator_mode = ITERATOR_LIST;
1305 qiter->iterator_data.list_data.list = (PyListObject *)sequence;
1306 qiter->iterator_data.list_data.list_index = 0;
1308 qiter->iterator_mode = ITERATOR_GENERIC;
1310 qiter->iterator_data.iter = MAKE_ITERATOR(tstate, sequence);
1311 if (unlikely(qiter->iterator_data.iter == NULL)) {
1319static PyObject *QUICK_ITERATOR_NEXT(PyThreadState *tstate,
struct Nuitka_QuickIterator *qiter,
bool *finished) {
1322 switch (qiter->iterator_mode) {
1323 case ITERATOR_GENERIC:
1324 result = ITERATOR_NEXT_ITERATOR(qiter->iterator_data.iter);
1326 if (result == NULL) {
1327 Py_DECREF(qiter->iterator_data.iter);
1329 if (unlikely(!CHECK_AND_CLEAR_STOP_ITERATION_OCCURRED(tstate))) {
1340 case ITERATOR_COMPILED_GENERATOR:
1341 result = Nuitka_Generator_qiter(tstate, qiter->iterator_data.generator, finished);
1344 case ITERATOR_TUPLE:
1345 if (qiter->iterator_data.tuple_data.tuple_index < PyTuple_GET_SIZE(qiter->iterator_data.tuple_data.tuple)) {
1347 PyTuple_GET_ITEM(qiter->iterator_data.tuple_data.tuple, qiter->iterator_data.tuple_data.tuple_index);
1348 qiter->iterator_data.tuple_data.tuple_index += 1;
1359 if (qiter->iterator_data.list_data.list_index < PyList_GET_SIZE(qiter->iterator_data.list_data.list)) {
1360 result = PyList_GET_ITEM(qiter->iterator_data.list_data.list, qiter->iterator_data.list_data.list_index);
1361 qiter->iterator_data.list_data.list_index += 1;
1377PyObject *BUILTIN_SUM1(PyThreadState *tstate, PyObject *sequence) {
1380 if (unlikely(MAKE_QUICK_ITERATOR(tstate, sequence, &qiter) ==
false)) {
1386 long int_result = 0;
1393 item = QUICK_ITERATOR_NEXT(tstate, &qiter, &finished);
1396 return Nuitka_PyInt_FromLong(int_result);
1397 }
else if (item == NULL) {
1404#if PYTHON_VERSION < 0x300
1405 if (PyInt_CheckExact(item)) {
1406 long b = PyInt_AS_LONG(item);
1407 long x = int_result + b;
1409 if ((x ^ int_result) >= 0 || (x ^ b) >= 0) {
1419#if PYTHON_VERSION >= 0x270
1420 if (PyLong_CheckExact(item)) {
1422 long b = Nuitka_PyLong_AsLongAndOverflow(item, &overflow);
1428 long x = int_result + b;
1430 if ((x ^ int_result) >= 0 || (x ^ b) >= 0) {
1439 if (item == Py_False) {
1440 Py_DECREF_IMMORTAL(item);
1444 if (item == Py_True) {
1446 long x = int_result + b;
1448 if ((x ^ int_result) >= 0 || (x ^ b) >= 0) {
1461 result = Nuitka_PyInt_FromLong(int_result);
1462 CHECK_OBJECT(result);
1464 PyObject *temp = PyNumber_Add(result, item);
1469 if (unlikely(result == NULL)) {
1473#if PYTHON_VERSION >= 0x3c0
1474 if (PyFloat_CheckExact(result)) {
1475 double f_result = PyFloat_AS_DOUBLE(result);
1477 Py_SETREF(result, NULL);
1481 item = QUICK_ITERATOR_NEXT(tstate, &qiter, &finished);
1484 if (c && Py_IS_FINITE(c)) {
1488 return MAKE_FLOAT_FROM_DOUBLE(f_result);
1489 }
else if (item == NULL) {
1495 if (PyFloat_CheckExact(item)) {
1497 double x = PyFloat_AS_DOUBLE(item);
1498 double t = f_result + x;
1500 if (fabs(f_result) >= fabs(x)) {
1501 c += (f_result - t) + x;
1503 c += (x - t) + f_result;
1512 if (PyLong_Check(item)) {
1514 long value = Nuitka_PyLong_AsLongAndOverflow(item, &overflow);
1517#if PYTHON_VERSION >= 0x3e0
1518 double x = (double)value;
1519 double t = f_result + x;
1521 if (fabs(f_result) >= fabs(x)) {
1522 c += (f_result - t) + x;
1524 c += (x - t) + f_result;
1529 f_result += (double)value;
1537 if (c && Py_IS_FINITE(c)) {
1541 result = MAKE_FLOAT_FROM_DOUBLE(f_result);
1543 if (result == NULL) {
1548 PyObject *temp2 = PyNumber_Add(result, item);
1553 if (unlikely(result == NULL)) {
1563 CHECK_OBJECT(result);
1566 item = QUICK_ITERATOR_NEXT(tstate, &qiter, &finished);
1570 }
else if (item == NULL) {
1577 PyObject *temp2 = PyNumber_Add(result, item);
1582 if (unlikely(temp2 == NULL)) {
1589 CHECK_OBJECT(result);
1594NUITKA_DEFINE_BUILTIN(sum);
1596PyObject *BUILTIN_SUM2(PyThreadState *tstate, PyObject *sequence, PyObject *start) {
1597 NUITKA_ASSIGN_BUILTIN(sum);
1599 CHECK_OBJECT(sequence);
1600 CHECK_OBJECT(start);
1602 PyObject *pos_args = MAKE_TUPLE2(tstate, sequence, start);
1604 PyObject *result = CALL_FUNCTION_WITH_POS_ARGS2(tstate, NUITKA_ACCESS_BUILTIN(sum), pos_args);
1606 Py_DECREF(pos_args);
1611PyDictObject *dict_builtin = NULL;
1614static PyTypeObject Nuitka_BuiltinModule_Type = {
1615 PyVarObject_HEAD_INIT(NULL, 0)
"compiled_module",
1619int Nuitka_BuiltinModule_SetAttr(
PyModuleObject *module, PyObject *name, PyObject *value) {
1620 CHECK_OBJECT(module);
1624 assert(value == NULL || Py_REFCNT(value) > 0);
1630 int res = PyObject_RichCompareBool(name, const_str_plain_open, Py_EQ);
1632 if (unlikely(res == -1)) {
1636 NUITKA_UPDATE_BUILTIN(open, value);
1640 if (found ==
false) {
1641 res = PyObject_RichCompareBool(name, const_str_plain___import__, Py_EQ);
1643 if (unlikely(res == -1)) {
1648 NUITKA_UPDATE_BUILTIN(__import__, value);
1653#if PYTHON_VERSION >= 0x300
1654 if (found ==
false) {
1655 res = PyObject_RichCompareBool(name, const_str_plain_print, Py_EQ);
1657 if (unlikely(res == -1)) {
1662 NUITKA_UPDATE_BUILTIN(print, value);
1668 if (found ==
false) {
1669 res = PyObject_RichCompareBool(name, const_str_plain_super, Py_EQ);
1671 if (unlikely(res == -1)) {
1676 NUITKA_UPDATE_BUILTIN(super, value);
1681 return PyObject_GenericSetAttr((PyObject *)module, name, value);
1684#if defined(__FreeBSD__) || defined(__OpenBSD__)
1685#include <sys/sysctl.h>
1688static PyObject *getPathSeparatorStringObject(
void) {
1689 static char const sep[2] = {SEP, 0};
1691 static PyObject *sep_str = NULL;
1693 if (sep_str == NULL) {
1694 sep_str = Nuitka_String_FromString(sep);
1697 CHECK_OBJECT(sep_str);
1702PyObject *JOIN_PATH2(PyObject *dirname, PyObject *filename) {
1703 CHECK_OBJECT(dirname);
1704 CHECK_OBJECT(filename);
1707 PyObject *result = dirname;
1709 if (dirname != const_str_empty) {
1710 result = PyNumber_InPlaceAdd(result, getPathSeparatorStringObject());
1711 CHECK_OBJECT(result);
1714 result = PyNumber_InPlaceAdd(result, filename);
1715 CHECK_OBJECT(result);
1720#if _NUITKA_EXE_MODE || _NUITKA_DLL_MODE
1722wchar_t const *getBinaryDirectoryWideChars(
bool resolve_symlinks) {
1723 static wchar_t binary_directory[MAXPATHLEN + 1];
1724 static bool init_done =
false;
1726 if (init_done ==
false) {
1727 binary_directory[0] = 0;
1730 copyStringSafeW(binary_directory, getBinaryFilenameWideChars(resolve_symlinks),
1731 sizeof(binary_directory) /
sizeof(
wchar_t));
1733 stripFilenameW(binary_directory);
1734 makeShortFilename(binary_directory,
sizeof(binary_directory) /
sizeof(
wchar_t));
1736 appendStringSafeW(binary_directory, getBinaryDirectoryHostEncoded(
true),
1737 sizeof(binary_directory) /
sizeof(
wchar_t));
1742 return (
wchar_t const *)binary_directory;
1746char const *getBinaryDirectoryHostEncoded(
bool resolve_symlinks) {
1747 static char *binary_directory = NULL;
1748 static char *binary_directory_resolved = NULL;
1750 char *binary_directory_target;
1752 if (resolve_symlinks) {
1753 binary_directory_target = binary_directory_resolved;
1755 binary_directory_target = binary_directory;
1758 if (binary_directory_target != NULL) {
1759 return binary_directory_target;
1761 wchar_t const *w = getBinaryDirectoryWideChars(resolve_symlinks);
1763 DWORD bufsize = WideCharToMultiByte(CP_ACP, 0, w, -1, NULL, 0, NULL, NULL);
1764 assert(bufsize != 0);
1766 binary_directory_target = (
char *)malloc(bufsize + 1);
1767 assert(binary_directory_target);
1769 DWORD res2 = WideCharToMultiByte(CP_ACP, 0, w, -1, binary_directory_target, bufsize, NULL, NULL);
1772 if (unlikely(res2 > bufsize)) {
1776 return (
char const *)binary_directory_target;
1781char const *getBinaryDirectoryHostEncoded(
bool resolve_symlinks) {
1782 const int buffer_size = MAXPATHLEN + 1;
1784 static char binary_directory[MAXPATHLEN + 1] = {0};
1785 static char binary_directory_resolved[MAXPATHLEN + 1] = {0};
1787 char *binary_directory_target;
1789 if (resolve_symlinks) {
1790 binary_directory_target = binary_directory_resolved;
1792 binary_directory_target = binary_directory;
1795 if (*binary_directory_target != 0) {
1796 return binary_directory_target;
1800 copyStringSafe(binary_directory_target, getBinaryFilenameHostEncoded(resolve_symlinks), buffer_size);
1803 copyStringSafe(binary_directory_target, dirname(binary_directory_target), buffer_size);
1805 return binary_directory_target;
1810#if _NUITKA_EXE_MODE || _NUITKA_ONEFILE_DLL_MODE
1811PyObject *getBinaryFilenameObject(
bool resolve_symlinks) {
1812 static PyObject *binary_filename = NULL;
1813 static PyObject *binary_filename_resolved = NULL;
1815 PyObject **binary_object_target;
1817 if (resolve_symlinks) {
1818 binary_object_target = &binary_filename_resolved;
1820 binary_object_target = &binary_filename;
1823 if (*binary_object_target != NULL) {
1824 CHECK_OBJECT(*binary_object_target);
1826 return *binary_object_target;
1831#if PYTHON_VERSION >= 0x300
1833 wchar_t const *exe_filename = getBinaryFilenameWideChars(resolve_symlinks);
1834 *binary_object_target = NuitkaUnicode_FromWideChar(exe_filename, -1);
1836 *binary_object_target = PyUnicode_DecodeFSDefault(getBinaryFilenameHostEncoded(resolve_symlinks));
1839 *binary_object_target = PyString_FromString(getBinaryFilenameHostEncoded(resolve_symlinks));
1842 if (unlikely(*binary_object_target == NULL)) {
1848 Py_INCREF(*binary_object_target);
1850 return *binary_object_target;
1854PyObject *getBinaryDirectoryObject(
bool resolve_symlinks) {
1855 static PyObject *binary_directory = NULL;
1856 static PyObject *binary_directory_resolved = NULL;
1858 PyObject **binary_object_target;
1860 if (resolve_symlinks) {
1861 binary_object_target = &binary_directory_resolved;
1863 binary_object_target = &binary_directory;
1866 if (*binary_object_target != NULL) {
1867 CHECK_OBJECT(*binary_object_target);
1869 return *binary_object_target;
1874#if PYTHON_VERSION >= 0x300
1876 wchar_t const *bin_directory = getBinaryDirectoryWideChars(resolve_symlinks);
1877 *binary_object_target = NuitkaUnicode_FromWideChar(bin_directory, -1);
1879 *binary_object_target = PyUnicode_DecodeFSDefault(getBinaryDirectoryHostEncoded(resolve_symlinks));
1882 *binary_object_target = PyString_FromString(getBinaryDirectoryHostEncoded(resolve_symlinks));
1885 if (unlikely(*binary_object_target == NULL)) {
1891 Py_INCREF(*binary_object_target);
1893 return *binary_object_target;
1897#if _NUITKA_DLL_MODE || _NUITKA_MODULE_MODE
1898static PyObject *getDllDirectoryObject(
void) {
1899 static PyObject *dll_directory = NULL;
1901 if (dll_directory == NULL) {
1902 filename_char_t
const *dll_directory_filename = getDllDirectory();
1904 dll_directory = Nuitka_String_FromFilename(dll_directory_filename);
1906#if PYTHON_VERSION < 0x300
1908 PyObject *decoded_dll_directory = PyObject_Str(dll_directory);
1910 if (decoded_dll_directory == NULL) {
1911 PyThreadState *tstate = PyThreadState_GET();
1912 DROP_ERROR_OCCURRED(tstate);
1914 Py_DECREF(dll_directory);
1915 dll_directory = decoded_dll_directory;
1920 CHECK_OBJECT(dll_directory);
1922 return dll_directory;
1925PyObject *getDllFilenameObject(
void) {
1926 static PyObject *dll_filename = NULL;
1928 if (dll_filename == NULL) {
1929 filename_char_t
const *dll_filename_str = getDllFilename();
1931 dll_filename = Nuitka_String_FromFilename(dll_filename_str);
1933#if PYTHON_VERSION < 0x300
1935 PyObject *decoded_dll_filename = PyObject_Str(dll_filename);
1937 if (decoded_dll_filename == NULL) {
1938 PyThreadState *tstate = PyThreadState_GET();
1939 DROP_ERROR_OCCURRED(tstate);
1941 Py_DECREF(dll_filename);
1942 dll_filename = decoded_dll_filename;
1947 CHECK_OBJECT(dll_filename);
1949 return dll_filename;
1953PyObject *getPythonProgramDirectoryObject(
bool resolve_symlinks) {
1955 return getBinaryDirectoryObject(resolve_symlinks);
1957 return getDllDirectoryObject();
1961PyObject *getContainingDirectoryObject(
bool resolve_symlinks) {
1962#if _NUITKA_ONEFILE_MODE
1963 environment_char_t
const *onefile_directory = getEnvironmentVariable(
"NUITKA_ONEFILE_DIRECTORY");
1964 if (onefile_directory != NULL) {
1965 PyObject *result = Nuitka_String_FromFilename(onefile_directory);
1966 unsetEnvironmentVariable(
"NUITKA_ONEFILE_DIRECTORY");
1971 return getPythonProgramDirectoryObject(resolve_symlinks);
1974#if _NUITKA_STANDALONE_MODE
1976PyObject *getStandaloneSysExecutablePath(PyObject *basename) {
1978 PyObject *dir_name = getBinaryDirectoryObject(
false);
1980 PyObject *dir_name = getDllDirectoryObject();
1982 PyObject *sys_executable = JOIN_PATH2(dir_name, basename);
1984 return sys_executable;
1988static void _initDeepCopy(PyThreadState *tstate);
1990void _initBuiltinModule(PyThreadState *tstate) {
1991 NUITKA_PRINT_TRACE(
"main(): Calling _initBuiltinTypeMethods().");
1992 _initBuiltinTypeMethods();
1994 NUITKA_PRINT_TRACE(
"main(): Calling _initDeepCopy().");
1995 _initDeepCopy(tstate);
1997#if _NUITKA_MODULE_MODE
1998 if (builtin_module != NULL) {
2002 assert(builtin_module == NULL);
2005#if PYTHON_VERSION < 0x300
2006 builtin_module = (
PyModuleObject *)PyImport_ImportModule(
"__builtin__");
2008 builtin_module = (
PyModuleObject *)PyImport_ImportModule(
"builtins");
2010 assert(builtin_module);
2011 dict_builtin = (PyDictObject *)builtin_module->md_dict;
2012 assert(PyDict_Check(dict_builtin));
2014#if _NUITKA_STANDALONE_MODE
2017 PyObject *nuitka_binary_dir = getBinaryDirectoryObject(
true);
2019 PyObject *nuitka_binary_dir = getDllDirectoryObject();
2021 NUITKA_MAY_BE_UNUSED
int res =
2022 PyDict_SetItemString((PyObject *)dict_builtin,
"__nuitka_binary_dir", nuitka_binary_dir);
2027#if _NUITKA_EXE_MODE || _NUITKA_ONEFILE_DLL_MODE
2028 PyDict_SetItemString((PyObject *)dict_builtin,
"__nuitka_binary_exe", getBinaryFilenameObject(
true));
2039 Nuitka_BuiltinModule_Type.tp_dealloc = PyModule_Type.tp_dealloc;
2040 Nuitka_BuiltinModule_Type.tp_repr = PyModule_Type.tp_repr;
2041 Nuitka_BuiltinModule_Type.tp_setattro = (setattrofunc)Nuitka_BuiltinModule_SetAttr;
2042 Nuitka_BuiltinModule_Type.tp_getattro = PyModule_Type.tp_getattro;
2043 Nuitka_BuiltinModule_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE;
2044 Nuitka_BuiltinModule_Type.tp_doc = PyModule_Type.tp_doc;
2045 Nuitka_BuiltinModule_Type.tp_traverse = PyModule_Type.tp_traverse;
2046 Nuitka_BuiltinModule_Type.tp_members = PyModule_Type.tp_members;
2047 Nuitka_BuiltinModule_Type.tp_base = &PyModule_Type;
2048 Nuitka_BuiltinModule_Type.tp_dictoffset = PyModule_Type.tp_dictoffset;
2049 Nuitka_BuiltinModule_Type.tp_init = PyModule_Type.tp_init;
2050 Nuitka_BuiltinModule_Type.tp_alloc = PyModule_Type.tp_alloc;
2051 Nuitka_BuiltinModule_Type.tp_new = PyModule_Type.tp_new;
2052 Nuitka_BuiltinModule_Type.tp_free = PyModule_Type.tp_free;
2053 NUITKA_MAY_BE_UNUSED
int res2 = PyType_Ready(&Nuitka_BuiltinModule_Type);
2057 ((PyObject *)builtin_module)->ob_type = &Nuitka_BuiltinModule_Type;
2058 assert(PyModule_Check(builtin_module) == 1);
2061#include "HelpersCalling.c"
2063PyObject *MAKE_RELATIVE_PATH(PyObject *relative) {
2064 CHECK_OBJECT(relative);
2066 static PyObject *our_path_object = NULL;
2068 if (our_path_object == NULL) {
2069 our_path_object = getPythonProgramDirectoryObject(
true);
2072 return JOIN_PATH2(our_path_object, relative);
2075#if !_NUITKA_MODULE_MODE
2077NUITKA_DEFINE_BUILTIN(type)
2078NUITKA_DEFINE_BUILTIN(len)
2079NUITKA_DEFINE_BUILTIN(repr)
2080NUITKA_DEFINE_BUILTIN(
int)
2081NUITKA_DEFINE_BUILTIN(iter)
2082#if PYTHON_VERSION < 0x300
2083NUITKA_DEFINE_BUILTIN(
long)
2085NUITKA_DEFINE_BUILTIN(range);
2088void _initBuiltinOriginalValues(
void) {
2089 NUITKA_ASSIGN_BUILTIN(type);
2090 NUITKA_ASSIGN_BUILTIN(len);
2091 NUITKA_ASSIGN_BUILTIN(range);
2092 NUITKA_ASSIGN_BUILTIN(repr);
2093 NUITKA_ASSIGN_BUILTIN(
int);
2094 NUITKA_ASSIGN_BUILTIN(iter);
2095#if PYTHON_VERSION < 0x300
2096 NUITKA_ASSIGN_BUILTIN(
long);
2099 CHECK_OBJECT(_python_original_builtin_value_range);
2105#if PYTHON_VERSION >= 0x300 && !defined(NUITKA_USE_PYCORE_THREAD_STATE)
2106volatile int _Py_Ticker = _Py_CheckInterval;
2109#if PYTHON_VERSION >= 0x270
2110iternextfunc default_iternext;
2112void _initSlotIterNext(
void) {
2113 PyThreadState *tstate = PyThreadState_GET();
2115 PyObject *pos_args = MAKE_TUPLE1(tstate, (PyObject *)&PyBaseObject_Type);
2118 PyObject *kw_args = PyDict_New();
2119 PyDict_SetItem(kw_args, const_str_plain___iter__, Py_True);
2122 PyObject_CallFunctionObjArgs((PyObject *)&PyType_Type, const_str_plain___iter__, pos_args, kw_args, NULL);
2123 Py_DECREF(pos_args);
2126 PyObject *r = PyObject_CallFunctionObjArgs(c, NULL);
2130 assert(Py_TYPE(r)->tp_iternext);
2132 default_iternext = Py_TYPE(r)->tp_iternext;
2138#if PYTHON_VERSION >= 0x3a0
2139PyObject *MAKE_UNION_TYPE(PyObject *args) {
2140 assert(PyTuple_CheckExact(args));
2141 assert(PyTuple_GET_SIZE(args) > 1);
2143 CHECK_OBJECT_DEEP(args);
2145 PyObject *result = NULL;
2147 for (Py_ssize_t i = 0; i < PyTuple_GET_SIZE(args); i++) {
2148 PyObject *value = PyTuple_GET_ITEM(args, i);
2150 if (result == NULL) {
2154 result = PyNumber_InPlaceBitor(result, value);
2162#include "HelpersAttributes.c"
2163#include "HelpersDeepcopy.c"
2164#include "HelpersOperationBinaryAdd.c"
2165#include "HelpersOperationBinaryBitand.c"
2166#include "HelpersOperationBinaryBitor.c"
2167#include "HelpersOperationBinaryBitxor.c"
2168#include "HelpersOperationBinaryDivmod.c"
2169#include "HelpersOperationBinaryFloordiv.c"
2170#include "HelpersOperationBinaryLshift.c"
2171#include "HelpersOperationBinaryMod.c"
2172#include "HelpersOperationBinaryMult.c"
2173#include "HelpersOperationBinaryPow.c"
2174#include "HelpersOperationBinaryRshift.c"
2175#include "HelpersOperationBinarySub.c"
2176#include "HelpersOperationBinaryTruediv.c"
2177#include "HelpersTypes.c"
2178#if PYTHON_VERSION < 0x300
2179#include "HelpersOperationBinaryOlddiv.c"
2181#if PYTHON_VERSION >= 0x350
2182#include "HelpersOperationBinaryMatmult.c"
2185#include "HelpersOperationBinaryDualAdd.c"
2187#include "HelpersOperationInplaceAdd.c"
2188#include "HelpersOperationInplaceBitand.c"
2189#include "HelpersOperationInplaceBitor.c"
2190#include "HelpersOperationInplaceBitxor.c"
2191#include "HelpersOperationInplaceFloordiv.c"
2192#include "HelpersOperationInplaceLshift.c"
2193#include "HelpersOperationInplaceMod.c"
2194#include "HelpersOperationInplaceMult.c"
2195#include "HelpersOperationInplacePow.c"
2196#include "HelpersOperationInplaceRshift.c"
2197#include "HelpersOperationInplaceSub.c"
2198#include "HelpersOperationInplaceTruediv.c"
2199#if PYTHON_VERSION < 0x300
2200#include "HelpersOperationInplaceOlddiv.c"
2202#if PYTHON_VERSION >= 0x350
2203#include "HelpersOperationInplaceMatmult.c"
2206#include "HelpersComparisonEq.c"
2207#include "HelpersComparisonLe.c"
2208#include "HelpersComparisonLt.c"
2210#include "HelpersComparisonGe.c"
2211#include "HelpersComparisonGt.c"
2212#include "HelpersComparisonNe.c"
2214#include "HelpersComparisonDualEq.c"
2215#include "HelpersComparisonDualLe.c"
2216#include "HelpersComparisonDualLt.c"
2218#include "HelpersComparisonDualGe.c"
2219#include "HelpersComparisonDualGt.c"
2220#include "HelpersComparisonDualNe.c"
2222#include "HelpersChecksumTools.c"
2223#include "HelpersConstantsBlob.c"
2226#include "HelpersProfiling.c"
2229#if _NUITKA_PGO_PYTHON
2230#include "HelpersPythonPgo.c"
2233#include "MetaPathBasedLoader.c"
2235#ifdef _NUITKA_EXPERIMENTAL_DUMP_C_TRACEBACKS
2236#include "HelpersDumpBacktraces.c"
2239#ifdef _NUITKA_INLINE_COPY_HACL
2240#include "Hacl_Hash_SHA2.c"
2243#include "HelpersJitSources.c"
Definition exceptions.h:712
Definition compiled_generator.h:41
Definition CompiledCodeHelpers.c:1271
Definition rangeobjects.h:38