Nuitka
The Python compiler
Loading...
Searching...
No Matches
CompiledCodeHelpers.c
1// Copyright 2025, Kay Hayen, mailto:kay.hayen@gmail.com find license text at end of file
2
3/* Implementations of compiled code helpers.
4
5 * The definition of a compiled code helper is that it's being used in
6 * generated C code and provides part of the operations implementation.
7 *
8 * Currently we also have standalone mode related code here, patches to CPython
9 * runtime that we do, and e.g. the built-in module. TODO: Move these to their
10 * own files for clarity.
11 */
12
13#include "nuitka/prelude.h"
14
15#include "HelpersBuiltinTypeMethods.c"
16
17static void _initBuiltinTypeMethods(void) {
18#if PYTHON_VERSION < 0x300
19 NUITKA_PRINT_TRACE("main(): Calling _initStrBuiltinMethods().");
20 _initStrBuiltinMethods();
21#else
22 NUITKA_PRINT_TRACE("main(): Calling _initBytesBuiltinMethods().");
23 _initBytesBuiltinMethods();
24#endif
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();
31}
32
33#if PYTHON_VERSION >= 0x350
34#include "HelpersAllocator.c"
35#endif
36
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"
54
55#include "HelpersEnvironmentVariables.c"
56#include "HelpersFilesystemPaths.c"
57#include "HelpersSafeStrings.c"
58
59#if PYTHON_VERSION >= 0x3a0
60#include "HelpersMatching.c"
61#endif
62
63#if PYTHON_VERSION < 0x300
64
65static Py_ssize_t ESTIMATE_RANGE(long low, long high, long step) {
66 if (low >= high) {
67 return 0;
68 } else {
69 return (high - low - 1) / step + 1;
70 }
71}
72
73static PyObject *_BUILTIN_RANGE_INT3(long low, long high, long step) {
74 assert(step != 0);
75
76 Py_ssize_t size;
77
78 if (step > 0) {
79 size = ESTIMATE_RANGE(low, high, step);
80 } else {
81 size = ESTIMATE_RANGE(high, low, -step);
82 }
83
84 PyObject *result = MAKE_LIST_EMPTY(tstate, size);
85
86 long current = low;
87
88 for (int i = 0; i < size; i++) {
89 PyList_SET_ITEM(result, i, Nuitka_PyInt_FromLong(current));
90 current += step;
91 }
92
93 return result;
94}
95
96static PyObject *_BUILTIN_RANGE_INT2(long low, long high) { return _BUILTIN_RANGE_INT3(low, high, 1); }
97
98static PyObject *_BUILTIN_RANGE_INT(long boundary) {
99 PyObject *result = MAKE_LIST_EMPTY(tstate, boundary > 0 ? boundary : 0);
100
101 for (int i = 0; i < boundary; i++) {
102 PyList_SET_ITEM(result, i, Nuitka_PyInt_FromLong(i));
103 }
104
105 return result;
106}
107
108static PyObject *TO_RANGE_ARG(PyObject *value, char const *name) {
109 if (likely(PyInt_Check(value) || PyLong_Check(value))) {
110 Py_INCREF(value);
111 return value;
112 }
113
114 PyTypeObject *type = Py_TYPE(value);
115 PyNumberMethods *tp_as_number = type->tp_as_number;
116
117 // Everything that casts to int is allowed.
118 if (
119#if PYTHON_VERSION >= 0x270
120 PyFloat_Check(value) ||
121#endif
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);
124 return NULL;
125 }
126
127 PyObject *result = tp_as_number->nb_int(value);
128
129 if (unlikely(result == NULL)) {
130 return NULL;
131 }
132
133 return result;
134}
135#endif
136
137#if PYTHON_VERSION < 0x300
138
139NUITKA_DEFINE_BUILTIN(range);
140
141PyObject *BUILTIN_RANGE(PyThreadState *tstate, PyObject *boundary) {
142 PyObject *boundary_temp = TO_RANGE_ARG(boundary, "end");
143
144 if (unlikely(boundary_temp == NULL)) {
145 return NULL;
146 }
147
148 long start = PyInt_AsLong(boundary_temp);
149
150 if (start == -1 && DROP_ERROR_OCCURRED(tstate)) {
151 NUITKA_ASSIGN_BUILTIN(range);
152
153 PyObject *result = CALL_FUNCTION_WITH_SINGLE_ARG(tstate, NUITKA_ACCESS_BUILTIN(range), boundary_temp);
154
155 Py_DECREF(boundary_temp);
156
157 return result;
158 }
159 Py_DECREF(boundary_temp);
160
161 return _BUILTIN_RANGE_INT(start);
162}
163
164PyObject *BUILTIN_RANGE2(PyThreadState *tstate, PyObject *low, PyObject *high) {
165 PyObject *low_temp = TO_RANGE_ARG(low, "start");
166
167 if (unlikely(low_temp == NULL)) {
168 return NULL;
169 }
170
171 PyObject *high_temp = TO_RANGE_ARG(high, "end");
172
173 if (unlikely(high_temp == NULL)) {
174 Py_DECREF(low_temp);
175 return NULL;
176 }
177
178 bool fallback = false;
179
180 long start = PyInt_AsLong(low_temp);
181
182 if (unlikely(start == -1 && DROP_ERROR_OCCURRED(tstate))) {
183 fallback = true;
184 }
185
186 long end = PyInt_AsLong(high_temp);
187
188 if (unlikely(end == -1 && DROP_ERROR_OCCURRED(tstate))) {
189 fallback = true;
190 }
191
192 if (fallback) {
193 // Transfers references to tuple.
194 PyObject *pos_args = MAKE_TUPLE2_0(tstate, low_temp, high_temp);
195 NUITKA_ASSIGN_BUILTIN(range);
196
197 PyObject *result = CALL_FUNCTION_WITH_POS_ARGS2(tstate, NUITKA_ACCESS_BUILTIN(range), pos_args);
198
199 Py_DECREF(pos_args);
200
201 return result;
202 } else {
203 Py_DECREF(low_temp);
204 Py_DECREF(high_temp);
205
206 return _BUILTIN_RANGE_INT2(start, end);
207 }
208}
209
210PyObject *BUILTIN_RANGE3(PyThreadState *tstate, PyObject *low, PyObject *high, PyObject *step) {
211 PyObject *low_temp = TO_RANGE_ARG(low, "start");
212
213 if (unlikely(low_temp == NULL)) {
214 return NULL;
215 }
216
217 PyObject *high_temp = TO_RANGE_ARG(high, "end");
218
219 if (unlikely(high_temp == NULL)) {
220 Py_DECREF(low_temp);
221 return NULL;
222 }
223
224 PyObject *step_temp = TO_RANGE_ARG(step, "step");
225
226 if (unlikely(high_temp == NULL)) {
227 Py_DECREF(low_temp);
228 Py_DECREF(high_temp);
229 return NULL;
230 }
231
232 bool fallback = false;
233
234 long start = PyInt_AsLong(low_temp);
235
236 if (unlikely(start == -1 && DROP_ERROR_OCCURRED(tstate))) {
237 fallback = true;
238 }
239
240 long end = PyInt_AsLong(high_temp);
241
242 if (unlikely(end == -1 && DROP_ERROR_OCCURRED(tstate))) {
243 fallback = true;
244 }
245
246 long step_long = PyInt_AsLong(step_temp);
247
248 if (unlikely(step_long == -1 && DROP_ERROR_OCCURRED(tstate))) {
249 fallback = true;
250 }
251
252 if (fallback) {
253 PyObject *pos_args = MAKE_TUPLE3_0(tstate, low_temp, high_temp, step_temp);
254
255 NUITKA_ASSIGN_BUILTIN(range);
256
257 PyObject *result = CALL_FUNCTION_WITH_POS_ARGS3(tstate, NUITKA_ACCESS_BUILTIN(range), pos_args);
258
259 Py_DECREF(pos_args);
260
261 return result;
262 } else {
263 Py_DECREF(low_temp);
264 Py_DECREF(high_temp);
265 Py_DECREF(step_temp);
266
267 if (unlikely(step_long == 0)) {
268 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ValueError, "range() step argument must not be zero");
269 return NULL;
270 }
271
272 return _BUILTIN_RANGE_INT3(start, end, step_long);
273 }
274}
275
276#endif
277
278#if PYTHON_VERSION < 0x300
279
280/* Same as CPython2: */
281static unsigned long getLengthOfRange(PyThreadState *tstate, long lo, long hi, long step) {
282 assert(step != 0);
283
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);
288 } else {
289 return 0UL;
290 }
291}
292
293/* Create a "xrange" object from C long values. Used for constant ranges. */
294PyObject *MAKE_XRANGE(PyThreadState *tstate, long start, long stop, long step) {
295 /* TODO: It would be sweet to calculate that on user side already. */
296 unsigned long n = getLengthOfRange(tstate, start, stop, step);
297
298 if (n > (unsigned long)LONG_MAX || (long)n > PY_SSIZE_T_MAX) {
299 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_OverflowError, "xrange() result has too many items");
300
301 return NULL;
302 }
303
304 // spell-checker: ignore rangeobject
305
306 struct _rangeobject2 *result = (struct _rangeobject2 *)PyObject_New(struct _rangeobject2, &PyRange_Type);
307 assert(result != NULL);
308
309 result->start = start;
310 result->len = (long)n;
311 result->step = step;
312
313 return (PyObject *)result;
314}
315
316#else
317
318/* Same as CPython3: */
319static PyObject *getLengthOfRange(PyThreadState *tstate, PyObject *start, PyObject *stop, PyObject *step) {
320 nuitka_bool nbool_res = RICH_COMPARE_GT_NBOOL_OBJECT_LONG(step, const_int_0);
321
322 if (unlikely(nbool_res == NUITKA_BOOL_EXCEPTION)) {
323 return NULL;
324 }
325
326 PyObject *lo, *hi;
327
328 // Make sure we use step as a positive number.
329 if (nbool_res == NUITKA_BOOL_TRUE) {
330 lo = start;
331 hi = stop;
332
333 Py_INCREF(step);
334 } else {
335 lo = stop;
336 hi = start;
337
338 step = PyNumber_Negative(step);
339
340 if (unlikely(step == NULL)) {
341 return NULL;
342 }
343
344 nbool_res = RICH_COMPARE_EQ_NBOOL_OBJECT_LONG(step, const_int_0);
345
346 if (unlikely(nbool_res == NUITKA_BOOL_EXCEPTION)) {
347 Py_DECREF(step);
348 return NULL;
349 }
350
351 if (unlikely(nbool_res == NUITKA_BOOL_TRUE)) {
352 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ValueError, "range() arg 3 must not be zero");
353 Py_DECREF(step);
354
355 return NULL;
356 }
357 }
358
359 // Negative difference, we got zero length.
360 nbool_res = RICH_COMPARE_GE_NBOOL_OBJECT_OBJECT(lo, hi);
361
362 // No distance means we do not have any length to go.
363 if (nbool_res != NUITKA_BOOL_FALSE) {
364 Py_DECREF(step);
365
366 if (unlikely(nbool_res == NUITKA_BOOL_EXCEPTION)) {
367 return NULL;
368 }
369
370 Py_INCREF(const_int_0);
371 return const_int_0;
372 }
373
374 // TODO: Use binary operations here, for now we only eliminated rich comparison API
375 PyObject *tmp1 = PyNumber_Subtract(hi, lo);
376
377 if (unlikely(tmp1 == NULL)) {
378 Py_DECREF(step);
379
380 return NULL;
381 }
382
383 PyObject *diff = PyNumber_Subtract(tmp1, const_int_pos_1);
384 Py_DECREF(tmp1);
385
386 if (unlikely(diff == NULL)) {
387 Py_DECREF(step);
388
389 return NULL;
390 }
391
392 tmp1 = PyNumber_FloorDivide(diff, step);
393 Py_DECREF(diff);
394 Py_DECREF(step);
395
396 if (unlikely(tmp1 == NULL)) {
397 return NULL;
398 }
399
400 PyObject *result = PyNumber_Add(tmp1, const_int_pos_1);
401 Py_DECREF(tmp1);
402
403 return result;
404}
405
406static PyObject *MAKE_XRANGE(PyThreadState *tstate, PyObject *start, PyObject *stop, PyObject *step) {
407 start = Nuitka_Number_IndexAsLong(start);
408 if (unlikely(start == NULL)) {
409 return NULL;
410 }
411 stop = Nuitka_Number_IndexAsLong(stop);
412 if (unlikely(stop == NULL)) {
413 return NULL;
414 }
415 step = Nuitka_Number_IndexAsLong(step);
416 if (unlikely(step == NULL)) {
417 return NULL;
418 }
419
420 PyObject *length = getLengthOfRange(tstate, start, stop, step);
421 if (unlikely(length == NULL)) {
422 return NULL;
423 }
424
425 struct _rangeobject3 *result = (struct _rangeobject3 *)PyObject_New(struct _rangeobject3, &PyRange_Type);
426 assert(result != NULL);
427
428 result->start = start;
429 result->stop = stop;
430 result->step = step;
431 result->length = length;
432
433 return (PyObject *)result;
434}
435#endif
436
437/* Built-in xrange (Python2) or xrange (Python3) with one argument. */
438PyObject *BUILTIN_XRANGE1(PyThreadState *tstate, PyObject *high) {
439#if PYTHON_VERSION < 0x300
440 if (unlikely(PyFloat_Check(high))) {
441 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError, "integer argument expected, got float");
442
443 return NULL;
444 }
445
446 long int_high = PyInt_AsLong(high);
447
448 if (unlikely(int_high == -1 && HAS_ERROR_OCCURRED(tstate))) {
449 return NULL;
450 }
451
452 return MAKE_XRANGE(tstate, 0, int_high, 1);
453#else
454 PyObject *stop = Nuitka_Number_IndexAsLong(high);
455
456 if (unlikely(stop == NULL)) {
457 return NULL;
458 }
459
460 PyObject *length = getLengthOfRange(tstate, const_int_0, stop, const_int_pos_1);
461 if (unlikely(length == NULL)) {
462 Py_DECREF(stop);
463
464 return NULL;
465 }
466
467 struct _rangeobject3 *result = (struct _rangeobject3 *)PyObject_New(struct _rangeobject3, &PyRange_Type);
468 assert(result != NULL);
469
470 result->start = const_int_0;
471 Py_INCREF(const_int_0);
472 result->stop = stop;
473 result->step = const_int_pos_1;
474 Py_INCREF(const_int_pos_1);
475
476 result->length = length;
477
478 return (PyObject *)result;
479#endif
480}
481
482/* Built-in xrange (Python2) or xrange (Python3) with two arguments. */
483PyObject *BUILTIN_XRANGE2(PyThreadState *tstate, PyObject *low, PyObject *high) {
484#if PYTHON_VERSION < 0x300
485 if (unlikely(PyFloat_Check(low))) {
486 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError, "integer argument expected, got float");
487
488 return NULL;
489 }
490
491 long int_low = PyInt_AsLong(low);
492
493 if (unlikely(int_low == -1 && HAS_ERROR_OCCURRED(tstate))) {
494 return NULL;
495 }
496
497 if (unlikely(PyFloat_Check(high))) {
498 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError, "integer argument expected, got float");
499
500 return NULL;
501 }
502
503 long int_high = PyInt_AsLong(high);
504
505 if (unlikely(int_high == -1 && HAS_ERROR_OCCURRED(tstate))) {
506 return NULL;
507 }
508
509 return MAKE_XRANGE(tstate, int_low, int_high, 1);
510#else
511 return MAKE_XRANGE(tstate, low, high, const_int_pos_1);
512#endif
513}
514
515/* Built-in xrange (Python2) or xrange (Python3) with three arguments. */
516PyObject *BUILTIN_XRANGE3(PyThreadState *tstate, PyObject *low, PyObject *high, PyObject *step) {
517#if PYTHON_VERSION < 0x300
518 if (unlikely(PyFloat_Check(low))) {
519 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError, "integer argument expected, got float");
520
521 return NULL;
522 }
523
524 long int_low = PyInt_AsLong(low);
525
526 if (unlikely(int_low == -1 && HAS_ERROR_OCCURRED(tstate))) {
527 return NULL;
528 }
529
530 if (unlikely(PyFloat_Check(high))) {
531 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError, "integer argument expected, got float");
532
533 return NULL;
534 }
535
536 long int_high = PyInt_AsLong(high);
537
538 if (unlikely(int_high == -1 && HAS_ERROR_OCCURRED(tstate))) {
539 return NULL;
540 }
541
542 if (unlikely(PyFloat_Check(step))) {
543 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError, "integer argument expected, got float");
544
545 return NULL;
546 }
547
548 long int_step = PyInt_AsLong(step);
549
550 if (unlikely(int_step == -1 && HAS_ERROR_OCCURRED(tstate))) {
551 return NULL;
552 }
553
554 if (unlikely(int_step == 0)) {
555 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ValueError, "range() arg 3 must not be zero");
556
557 return NULL;
558 }
559
560 return MAKE_XRANGE(tstate, int_low, int_high, int_step);
561#else
562 return MAKE_XRANGE(tstate, low, high, step);
563#endif
564}
565
566PyObject *BUILTIN_ALL(PyThreadState *tstate, PyObject *value) {
567 CHECK_OBJECT(value);
568
569 PyObject *it = PyObject_GetIter(value);
570
571 if (unlikely((it == NULL))) {
572 return NULL;
573 }
574
575 iternextfunc iternext = Py_TYPE(it)->tp_iternext;
576 for (;;) {
577 PyObject *item = iternext(it);
578
579 if (unlikely((item == NULL)))
580 break;
581 int cmp = PyObject_IsTrue(item);
582 Py_DECREF(item);
583 if (unlikely(cmp < 0)) {
584 Py_DECREF(it);
585 return NULL;
586 }
587
588 if (cmp == 0) {
589 Py_DECREF(it);
590 Py_INCREF_IMMORTAL(Py_False);
591 return Py_False;
592 }
593 }
594
595 Py_DECREF(it);
596
597 if (unlikely(!CHECK_AND_CLEAR_STOP_ITERATION_OCCURRED(tstate))) {
598 return NULL;
599 }
600
601 Py_INCREF_IMMORTAL(Py_True);
602 return Py_True;
603}
604
605PyObject *BUILTIN_LEN(PyThreadState *tstate, PyObject *value) {
606 CHECK_OBJECT(value);
607
608 Py_ssize_t res = Nuitka_PyObject_Size(value);
609
610 if (unlikely(res < 0 && HAS_ERROR_OCCURRED(tstate))) {
611 return NULL;
612 }
613
614 return PyInt_FromSsize_t(res);
615}
616
617PyObject *BUILTIN_ANY(PyThreadState *tstate, PyObject *value) {
618 CHECK_OBJECT(value);
619
620 PyObject *it = PyObject_GetIter(value);
621
622 if (unlikely((it == NULL))) {
623 return NULL;
624 }
625
626 iternextfunc iternext = Py_TYPE(it)->tp_iternext;
627 for (;;) {
628 PyObject *item = iternext(it);
629
630 if (unlikely((item == NULL)))
631 break;
632 int cmp = PyObject_IsTrue(item);
633 Py_DECREF(item);
634 if (unlikely(cmp < 0)) {
635 Py_DECREF(it);
636 return NULL;
637 }
638 if (cmp > 0) {
639 Py_DECREF(it);
640 Py_INCREF_IMMORTAL(Py_True);
641 return Py_True;
642 }
643 }
644
645 Py_DECREF(it);
646 if (unlikely(!CHECK_AND_CLEAR_STOP_ITERATION_OCCURRED(tstate))) {
647 return NULL;
648 }
649
650 Py_INCREF_IMMORTAL(Py_False);
651 return Py_False;
652}
653
654PyObject *BUILTIN_ABS(PyObject *o) {
655 CHECK_OBJECT(o);
656
657 PyNumberMethods *m = o->ob_type->tp_as_number;
658 if (likely(m && m->nb_absolute)) {
659 return m->nb_absolute(o);
660 }
661
662 return PyErr_Format(PyExc_TypeError, "bad operand type for abs(): '%s'", Py_TYPE(o)->tp_name);
663}
664
665NUITKA_DEFINE_BUILTIN(format);
666
667PyObject *BUILTIN_FORMAT(PyThreadState *tstate, PyObject *value, PyObject *format_spec) {
668 CHECK_OBJECT(value);
669 CHECK_OBJECT(format_spec);
670
671 NUITKA_ASSIGN_BUILTIN(format);
672
673 PyObject *args[2] = {value, format_spec};
674
675 return CALL_FUNCTION_WITH_ARGS2(tstate, NUITKA_ACCESS_BUILTIN(format), args);
676}
677
678// Helper functions for print. Need to play nice with Python softspace
679// behavior. spell-checker: ignore softspace
680
681#if PYTHON_VERSION >= 0x300
682NUITKA_DEFINE_BUILTIN(print);
683#endif
684
685bool PRINT_NEW_LINE_TO(PyObject *file) {
686 PyThreadState *tstate = PyThreadState_GET();
687
688#if PYTHON_VERSION < 0x300
689 if (file == NULL || file == Py_None) {
690 file = GET_STDOUT();
691
692 if (unlikely(file == NULL)) {
693 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError, "lost sys.stdout");
694 return false;
695 }
696 }
697
698 // need to hold a reference to the file or else __getattr__ may release
699 // "file" in the mean time.
700 Py_INCREF(file);
701
702 if (unlikely(PyFile_WriteString("\n", file) == -1)) {
703 Py_DECREF(file);
704 return false;
705 }
706
707 PyFile_SoftSpace(file, 0);
708 CHECK_OBJECT(file);
709
710 Py_DECREF(file);
711 return true;
712#else
713 NUITKA_ASSIGN_BUILTIN(print);
714
715 struct Nuitka_ExceptionPreservationItem saved_exception_state;
716
717 FETCH_ERROR_OCCURRED_STATE_UNTRACED(tstate, &saved_exception_state);
718
719 PyObject *result;
720
721 if (likely(file == NULL)) {
722 result = CALL_FUNCTION_NO_ARGS(tstate, NUITKA_ACCESS_BUILTIN(print));
723 } else {
724 PyObject *kw_pairs[2] = {const_str_plain_file, GET_STDOUT()};
725 PyObject *kw_args = MAKE_DICT(kw_pairs, 1);
726
727 // TODO: This should use something that does not build a dictionary at all, and not
728 // uses a tuple.
729 result = CALL_FUNCTION_WITH_KW_ARGS(tstate, NUITKA_ACCESS_BUILTIN(print), kw_args);
730
731 Py_DECREF(kw_args);
732 }
733
734 Py_XDECREF(result);
735
736 RESTORE_ERROR_OCCURRED_STATE_UNTRACED(tstate, &saved_exception_state);
737
738 return result != NULL;
739#endif
740}
741
742bool PRINT_ITEM_TO(PyObject *file, PyObject *object) {
743 PyThreadState *tstate = PyThreadState_GET();
744
745// The print built-in function cannot replace "softspace" behavior of CPython
746// print statement, so this code is really necessary.
747#if PYTHON_VERSION < 0x300
748 if (file == NULL || file == Py_None) {
749 file = GET_STDOUT();
750
751 if (unlikely(file == NULL)) {
752 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError, "lost sys.stdout");
753 return false;
754 }
755 }
756
757 CHECK_OBJECT(file);
758 CHECK_OBJECT(object);
759
760 // need to hold a reference to the file or else "__getattr__" code may
761 // release "file" in the mean time.
762 Py_INCREF(file);
763
764 // Check for soft space indicator
765 if (PyFile_SoftSpace(file, 0)) {
766 if (unlikely(PyFile_WriteString(" ", file) == -1)) {
767 Py_DECREF(file);
768 return false;
769 }
770 }
771
772 if (unlikely(PyFile_WriteObject(object, file, Py_PRINT_RAW) == -1)) {
773 Py_DECREF(file);
774 return false;
775 }
776
777 if (PyString_Check(object)) {
778 char *buffer;
779 Py_ssize_t length;
780
781#ifndef __NUITKA_NO_ASSERT__
782 int status =
783#endif
784 PyString_AsStringAndSize(object, &buffer, &length);
785 assert(status != -1);
786
787 if (length == 0 || !isspace(Py_CHARMASK(buffer[length - 1])) || buffer[length - 1] == ' ') {
788 PyFile_SoftSpace(file, 1);
789 }
790 } else if (PyUnicode_Check(object)) {
791 Py_UNICODE *buffer = PyUnicode_AS_UNICODE(object);
792 Py_ssize_t length = PyUnicode_GET_SIZE(object);
793
794 if (length == 0 || !Py_UNICODE_ISSPACE(buffer[length - 1]) || buffer[length - 1] == ' ') {
795 PyFile_SoftSpace(file, 1);
796 }
797 } else {
798 PyFile_SoftSpace(file, 1);
799 }
800
801 CHECK_OBJECT(file);
802 Py_DECREF(file);
803
804 return true;
805#else
806 NUITKA_ASSIGN_BUILTIN(print);
807
808 struct Nuitka_ExceptionPreservationItem saved_exception_state;
809
810 FETCH_ERROR_OCCURRED_STATE_UNTRACED(tstate, &saved_exception_state);
811
812 // TODO: Have a helper that creates a dictionary for PyObject **
813 PyObject *print_kw = MAKE_DICT_EMPTY(tstate);
814 DICT_SET_ITEM(print_kw, const_str_plain_end, const_str_empty);
815
816 if (file == NULL) {
817 DICT_SET_ITEM(print_kw, const_str_plain_file, GET_STDOUT());
818 } else {
819 DICT_SET_ITEM(print_kw, const_str_plain_file, file);
820 }
821
822 PyObject *print_args = MAKE_TUPLE1(tstate, object);
823
824 PyObject *result = CALL_FUNCTION(tstate, NUITKA_ACCESS_BUILTIN(print), print_args, print_kw);
825
826 Py_DECREF(print_args);
827 Py_DECREF(print_kw);
828
829 Py_XDECREF(result);
830
831 RESTORE_ERROR_OCCURRED_STATE_UNTRACED(tstate, &saved_exception_state);
832
833 return result != NULL;
834#endif
835}
836
837void PRINT_REFCOUNT(PyObject *object) {
838 if (object) {
839#if PYTHON_VERSION >= 0x3c0
840 if (_Py_IsImmortal(object)) {
841 PRINT_STRING(" refcnt IMMORTAL");
842 return;
843 }
844#endif
845 char buffer[1024];
846 snprintf(buffer, sizeof(buffer) - 1, " refcnt %" PY_FORMAT_SIZE_T "d ", Py_REFCNT(object));
847
848 PRINT_STRING(buffer);
849 } else {
850 PRINT_STRING(" <null>");
851 }
852}
853
854bool PRINT_STRING(char const *str) {
855 if (str) {
856 PyObject *tmp = PyUnicode_FromString(str);
857 bool res = PRINT_ITEM(tmp);
858 Py_DECREF(tmp);
859 return res;
860 } else {
861 return PRINT_STRING("<nullstr>");
862 }
863}
864
865bool PRINT_STRING_W(wchar_t const *str) {
866 if (str) {
867 PyObject *tmp = NuitkaUnicode_FromWideChar(str, -1);
868 bool res = PRINT_ITEM(tmp);
869 Py_DECREF(tmp);
870 return res;
871 } else {
872 return PRINT_STRING("<nullstr>");
873 }
874}
875
876bool PRINT_FORMAT(char const *fmt, ...) {
877 va_list args;
878 va_start(args, fmt);
879
880 // Only used for debug purposes, lets be unsafe here.
881 char buffer[4096];
882
883 vsprintf(buffer, fmt, args);
884 va_end(args);
885
886 return PRINT_STRING(buffer);
887}
888
889bool PRINT_REPR(PyObject *object) {
890 PyThreadState *tstate = PyThreadState_GET();
891
892 struct Nuitka_ExceptionPreservationItem saved_exception_state;
893
894 FETCH_ERROR_OCCURRED_STATE_UNTRACED(tstate, &saved_exception_state);
895
896 bool res;
897
898 if (object != NULL) {
899 CHECK_OBJECT(object);
900
901 // Cannot have error set for this function, it asserts against that
902 // in debug builds.
903 PyObject *repr = PyObject_Repr(object);
904
905 res = PRINT_ITEM(repr);
906 Py_DECREF(repr);
907 } else {
908 res = PRINT_NULL();
909 }
910
911 RESTORE_ERROR_OCCURRED_STATE_UNTRACED(tstate, &saved_exception_state);
912
913 return res;
914}
915
916bool PRINT_NULL(void) { return PRINT_STRING("<NULL>"); }
917
918bool PRINT_TYPE(PyObject *object) { return PRINT_ITEM((PyObject *)Py_TYPE(object)); }
919
920void _PRINT_EXCEPTION3(PyObject *exception_type, PyObject *exception_value, PyTracebackObject *exception_tb) {
921 PRINT_REPR(exception_type);
922 if (exception_type != NULL) {
923 PRINT_REFCOUNT(exception_type);
924 }
925 PRINT_STRING("|");
926 PRINT_REPR(exception_value);
927 if (exception_value != NULL) {
928 PRINT_REFCOUNT(exception_value);
929 }
930#if PYTHON_VERSION >= 0x300
931 if (exception_value != NULL && PyExceptionInstance_Check(exception_value)) {
932 PRINT_STRING(" <- context ");
933 PyObject *context = Nuitka_Exception_GetContext(exception_value);
934 PRINT_REPR(context);
935 }
936#endif
937 PRINT_STRING("|");
938 PRINT_REPR((PyObject *)exception_tb);
939 if (exception_tb != NULL) {
940 PRINT_REFCOUNT((PyObject *)exception_tb);
941 }
942
943 PRINT_NEW_LINE();
944}
945
946#if PYTHON_VERSION >= 0x3b0
947void _PRINT_EXCEPTION1(PyObject *exception_value) {
948 PyObject *exception_type = exception_value ? PyExceptionInstance_Class(exception_value) : NULL;
949 PyTracebackObject *exception_tb = (exception_value && PyExceptionInstance_Check(exception_value))
950 ? GET_EXCEPTION_TRACEBACK(exception_value)
951 : NULL;
952
953 _PRINT_EXCEPTION3(exception_type, exception_value, exception_tb);
954}
955#endif
956
957void PRINT_CURRENT_EXCEPTION(void) {
958 PyThreadState *tstate = PyThreadState_GET();
959
960 PRINT_STRING("current_exc=");
961#if PYTHON_VERSION < 0x3c0
962 PRINT_EXCEPTION(tstate->curexc_type, tstate->curexc_value, (PyTracebackObject *)tstate->curexc_traceback);
963#else
964 _PRINT_EXCEPTION1(tstate->current_exception);
965#endif
966}
967
968void PRINT_PUBLISHED_EXCEPTION(void) {
969 PyThreadState *tstate = PyThreadState_GET();
970
971 PRINT_STRING("thread_exc=");
972#if PYTHON_VERSION < 0x3b0
973 PRINT_EXCEPTION(EXC_TYPE(tstate), EXC_VALUE(tstate), EXC_TRACEBACK(tstate));
974#else
975 PyObject *exc_value = EXC_VALUE(tstate);
976#if PYTHON_VERSION < 0x3c0
977 PyTracebackObject *exc_tb = (exc_value != NULL && exc_value != Py_None) ? GET_EXCEPTION_TRACEBACK(exc_value) : NULL;
978#endif
979 PRINT_EXCEPTION(EXC_TYPE(tstate), exc_value, exc_tb);
980#endif
981}
982
983// TODO: Could be ported, the "printf" stuff would need to be split. On Python3
984// the normal C print output gets lost.
985#if PYTHON_VERSION < 0x300
986void PRINT_TRACEBACK(PyTracebackObject *traceback) {
987 PRINT_STRING("Dumping traceback:\n");
988
989 if (traceback == NULL)
990 PRINT_STRING("<NULL traceback?!>\n");
991
992 while (traceback != NULL) {
993 printf(" line %d (frame object chain):\n", traceback->tb_lineno);
994
995 PyFrameObject *frame = traceback->tb_frame;
996
997 while (frame != NULL) {
998 printf(" Frame at %s\n", PyString_AsString(PyObject_Str((PyObject *)Nuitka_Frame_GetCodeObject(frame))));
999
1000 frame = frame->f_back;
1001 }
1002
1003 assert(traceback->tb_next != traceback);
1004 traceback = traceback->tb_next;
1005 }
1006
1007 PRINT_STRING("End of Dump.\n");
1008}
1009#endif
1010
1011PyObject *GET_STDOUT(void) {
1012 PyObject *result = Nuitka_SysGetObject("stdout");
1013
1014 if (unlikely(result == NULL)) {
1015 PyThreadState *tstate = PyThreadState_GET();
1016
1017 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError, "lost sys.stdout");
1018 return NULL;
1019 }
1020
1021 return result;
1022}
1023
1024PyObject *GET_STDERR(void) {
1025 PyObject *result = Nuitka_SysGetObject("stderr");
1026
1027 if (unlikely(result == NULL)) {
1028 PyThreadState *tstate = PyThreadState_GET();
1029
1030 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError, "lost sys.stderr");
1031 return NULL;
1032 }
1033
1034 return result;
1035}
1036
1037void FLUSH_STDOUT(void) {
1038 PyObject *stdout_handle = GET_STDOUT();
1039
1040 PyObject *method = PyObject_GetAttrString(stdout_handle, "flush");
1041
1042 PyThreadState *tstate = PyThreadState_GET();
1043 PyObject *result = CALL_FUNCTION_NO_ARGS(tstate, method);
1044
1045 Py_XDECREF(result);
1046}
1047
1048void FLUSH_STDERR(void) {
1049 PyObject *stderr_handle = GET_STDERR();
1050
1051 PyObject *method = PyObject_GetAttrString(stderr_handle, "flush");
1052
1053 PyThreadState *tstate = PyThreadState_GET();
1054 PyObject *result = CALL_FUNCTION_NO_ARGS(tstate, method);
1055
1056 Py_XDECREF(result);
1057}
1058
1059bool PRINT_NEW_LINE(void) { return PRINT_NEW_LINE_TO(NULL); }
1060
1061bool PRINT_ITEM(PyObject *object) {
1062 if (object == NULL) {
1063 return PRINT_NULL();
1064 } else {
1065 return PRINT_ITEM_TO(NULL, object);
1066 }
1067}
1068
1069bool PRINT_ITEM_LINE(PyObject *object) { return PRINT_ITEM(object) && PRINT_NEW_LINE(); }
1070
1071#if PYTHON_VERSION < 0x300
1072
1073static void set_slot(PyObject **slot, PyObject *value) {
1074 PyObject *temp = *slot;
1075 Py_XINCREF(value);
1076 *slot = value;
1077 Py_XDECREF(temp);
1078}
1079
1080static void set_attr_slots(PyClassObject *class_object) {
1081 set_slot(&class_object->cl_getattr, FIND_ATTRIBUTE_IN_CLASS(class_object, const_str_plain___getattr__));
1082 set_slot(&class_object->cl_setattr, FIND_ATTRIBUTE_IN_CLASS(class_object, const_str_plain___setattr__));
1083 set_slot(&class_object->cl_delattr, FIND_ATTRIBUTE_IN_CLASS(class_object, const_str_plain___delattr__));
1084}
1085
1086static bool set_dict(PyClassObject *class_object, PyObject *value) {
1087 if (value == NULL || !PyDict_Check(value)) {
1088 PyThreadState *tstate = PyThreadState_GET();
1089 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError, "__dict__ must be a dictionary object");
1090 return false;
1091 } else {
1092 set_slot(&class_object->cl_dict, value);
1093 set_attr_slots(class_object);
1094
1095 return true;
1096 }
1097}
1098
1099static bool set_bases(PyClassObject *class_object, PyObject *value) {
1100 if (value == NULL || !PyTuple_Check(value)) {
1101
1102 PyThreadState *tstate = PyThreadState_GET();
1103
1104 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError, "__bases__ must be a tuple object");
1105 return false;
1106 } else {
1107 Py_ssize_t n = PyTuple_GET_SIZE(value);
1108
1109 for (Py_ssize_t i = 0; i < n; i++) {
1110 PyObject *base = PyTuple_GET_ITEM(value, i);
1111
1112 if (unlikely(!PyClass_Check(base))) {
1113 PyThreadState *tstate = PyThreadState_GET();
1114
1115 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError, "__bases__ items must be classes");
1116 return false;
1117 }
1118
1119 if (unlikely(PyClass_IsSubclass(base, (PyObject *)class_object))) {
1120 PyThreadState *tstate = PyThreadState_GET();
1121
1122 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
1123 "a __bases__ item causes an inheritance cycle");
1124 return false;
1125 }
1126 }
1127
1128 set_slot(&class_object->cl_bases, value);
1129 set_attr_slots(class_object);
1130
1131 return true;
1132 }
1133}
1134
1135static bool set_name(PyClassObject *class_object, PyObject *value) {
1136 if (value == NULL || !PyDict_Check(value)) {
1137 PyThreadState *tstate = PyThreadState_GET();
1138
1139 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError, "__name__ must be a string object");
1140 return false;
1141 }
1142
1143 if (strlen(PyString_AS_STRING(value)) != (size_t)PyString_GET_SIZE(value)) {
1144 PyThreadState *tstate = PyThreadState_GET();
1145
1146 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError, "__name__ must not contain null bytes");
1147 return false;
1148 }
1149
1150 set_slot(&class_object->cl_name, value);
1151 return true;
1152}
1153
1154static int nuitka_class_setattr(PyClassObject *class_object, PyObject *attr_name, PyObject *value) {
1155 char const *sattr_name = PyString_AsString(attr_name);
1156
1157 if (sattr_name[0] == '_' && sattr_name[1] == '_') {
1158 Py_ssize_t n = PyString_Size(attr_name);
1159
1160 if (sattr_name[n - 2] == '_' && sattr_name[n - 1] == '_') {
1161 if (strcmp(sattr_name, "__dict__") == 0) {
1162 if (set_dict(class_object, value) == false) {
1163 return -1;
1164 } else {
1165 return 0;
1166 }
1167 } else if (strcmp(sattr_name, "__bases__") == 0) {
1168 if (set_bases(class_object, value) == false) {
1169 return -1;
1170 } else {
1171 return 0;
1172 }
1173 } else if (strcmp(sattr_name, "__name__") == 0) {
1174 if (set_name(class_object, value) == false) {
1175 return -1;
1176 } else {
1177 return 0;
1178 }
1179 } else if (strcmp(sattr_name, "__getattr__") == 0) {
1180 set_slot(&class_object->cl_getattr, value);
1181 } else if (strcmp(sattr_name, "__setattr__") == 0) {
1182 set_slot(&class_object->cl_setattr, value);
1183 } else if (strcmp(sattr_name, "__delattr__") == 0) {
1184 set_slot(&class_object->cl_delattr, value);
1185 }
1186 }
1187 }
1188
1189 if (value == NULL) {
1190 int status = DICT_REMOVE_ITEM(class_object->cl_dict, attr_name);
1191
1192 if (status < 0) {
1193 PyErr_Format(PyExc_AttributeError, "class %s has no attribute '%s'",
1194 PyString_AS_STRING(class_object->cl_name), sattr_name);
1195 }
1196
1197 return status;
1198 } else {
1199 return DICT_SET_ITEM(class_object->cl_dict, attr_name, value) ? 0 : -1;
1200 }
1201}
1202
1203static PyObject *nuitka_class_getattr(PyClassObject *class_object, PyObject *attr_name) {
1204 char const *sattr_name = PyString_AsString(attr_name);
1205
1206 if (sattr_name[0] == '_' && sattr_name[1] == '_') {
1207 if (strcmp(sattr_name, "__dict__") == 0) {
1208 Py_INCREF(class_object->cl_dict);
1209 return class_object->cl_dict;
1210 } else if (strcmp(sattr_name, "__bases__") == 0) {
1211 Py_INCREF(class_object->cl_bases);
1212 return class_object->cl_bases;
1213 } else if (strcmp(sattr_name, "__name__") == 0) {
1214 if (class_object->cl_name == NULL) {
1215 Py_INCREF_IMMORTAL(Py_None);
1216 return Py_None;
1217 } else {
1218 Py_INCREF(class_object->cl_name);
1219 return class_object->cl_name;
1220 }
1221 }
1222 }
1223
1224 PyObject *value = FIND_ATTRIBUTE_IN_CLASS(class_object, attr_name);
1225
1226 if (unlikely(value == NULL)) {
1227 PyErr_Format(PyExc_AttributeError, "class %s has no attribute '%s'", PyString_AS_STRING(class_object->cl_name),
1228 sattr_name);
1229 return NULL;
1230 }
1231
1232 PyTypeObject *type = Py_TYPE(value);
1233
1234 descrgetfunc tp_descr_get = NuitkaType_HasFeatureClass(type) ? type->tp_descr_get : NULL;
1235
1236 if (tp_descr_get == NULL) {
1237 Py_INCREF(value);
1238 return value;
1239 } else {
1240 return tp_descr_get(value, (PyObject *)NULL, (PyObject *)class_object);
1241 }
1242}
1243
1244#endif
1245
1246void enhancePythonTypes(void) {
1247#if PYTHON_VERSION < 0x300
1248 // Our own variant won't call PyEval_GetRestricted, saving quite some cycles
1249 // not doing that.
1250 PyClass_Type.tp_setattro = (setattrofunc)nuitka_class_setattr;
1251 PyClass_Type.tp_getattro = (getattrofunc)nuitka_class_getattr;
1252#endif
1253}
1254
1255#ifdef __FreeBSD__
1256#include <floatingpoint.h>
1257#endif
1258
1259#define ITERATOR_GENERIC 0
1260#define ITERATOR_COMPILED_GENERATOR 1
1261#define ITERATOR_TUPLE 2
1262#define ITERATOR_LIST 3
1263
1265 int iterator_mode;
1266
1267 union {
1268 // ITERATOR_GENERIC
1269 PyObject *iter;
1270
1271 // ITERATOR_COMPILED_GENERATOR
1272 struct Nuitka_GeneratorObject *generator;
1273
1274 // ITERATOR_TUPLE
1275 struct {
1276 PyTupleObject *tuple;
1277 Py_ssize_t tuple_index;
1278 } tuple_data;
1279
1280 // ITERATOR_LIST
1281 struct {
1282 PyListObject *list;
1283 Py_ssize_t list_index;
1284 } list_data;
1285 } iterator_data;
1286};
1287
1288static bool MAKE_QUICK_ITERATOR(PyThreadState *tstate, PyObject *sequence, struct Nuitka_QuickIterator *qiter) {
1289 if (Nuitka_Generator_Check(sequence)) {
1290 qiter->iterator_mode = ITERATOR_COMPILED_GENERATOR;
1291 qiter->iterator_data.generator = (struct Nuitka_GeneratorObject *)sequence;
1292 } else if (PyTuple_CheckExact(sequence)) {
1293 qiter->iterator_mode = ITERATOR_TUPLE;
1294 qiter->iterator_data.tuple_data.tuple = (PyTupleObject *)sequence;
1295 qiter->iterator_data.tuple_data.tuple_index = 0;
1296 } else if (PyList_CheckExact(sequence)) {
1297 qiter->iterator_mode = ITERATOR_LIST;
1298 qiter->iterator_data.list_data.list = (PyListObject *)sequence;
1299 qiter->iterator_data.list_data.list_index = 0;
1300 } else {
1301 qiter->iterator_mode = ITERATOR_GENERIC;
1302
1303 qiter->iterator_data.iter = MAKE_ITERATOR(tstate, sequence);
1304 if (unlikely(qiter->iterator_data.iter == NULL)) {
1305 return false;
1306 }
1307 }
1308
1309 return true;
1310}
1311
1312static PyObject *QUICK_ITERATOR_NEXT(PyThreadState *tstate, struct Nuitka_QuickIterator *qiter, bool *finished) {
1313 PyObject *result;
1314
1315 switch (qiter->iterator_mode) {
1316 case ITERATOR_GENERIC:
1317 result = ITERATOR_NEXT_ITERATOR(qiter->iterator_data.iter);
1318
1319 if (result == NULL) {
1320 Py_DECREF(qiter->iterator_data.iter);
1321
1322 if (unlikely(!CHECK_AND_CLEAR_STOP_ITERATION_OCCURRED(tstate))) {
1323 *finished = false;
1324 return NULL;
1325 }
1326
1327 *finished = true;
1328 return NULL;
1329 }
1330
1331 *finished = false;
1332 return result;
1333 case ITERATOR_COMPILED_GENERATOR:
1334 result = Nuitka_Generator_qiter(tstate, qiter->iterator_data.generator, finished);
1335
1336 return result;
1337 case ITERATOR_TUPLE:
1338 if (qiter->iterator_data.tuple_data.tuple_index < PyTuple_GET_SIZE(qiter->iterator_data.tuple_data.tuple)) {
1339 result =
1340 PyTuple_GET_ITEM(qiter->iterator_data.tuple_data.tuple, qiter->iterator_data.tuple_data.tuple_index);
1341 qiter->iterator_data.tuple_data.tuple_index += 1;
1342
1343 *finished = false;
1344
1345 Py_INCREF(result);
1346 return result;
1347 } else {
1348 *finished = true;
1349 return NULL;
1350 }
1351 case ITERATOR_LIST:
1352 if (qiter->iterator_data.list_data.list_index < PyList_GET_SIZE(qiter->iterator_data.list_data.list)) {
1353 result = PyList_GET_ITEM(qiter->iterator_data.list_data.list, qiter->iterator_data.list_data.list_index);
1354 qiter->iterator_data.list_data.list_index += 1;
1355
1356 *finished = false;
1357
1358 Py_INCREF(result);
1359 return result;
1360 } else {
1361 *finished = true;
1362 return NULL;
1363 }
1364 }
1365
1366 assert(false);
1367 return NULL;
1368}
1369
1370PyObject *BUILTIN_SUM1(PyThreadState *tstate, PyObject *sequence) {
1371 struct Nuitka_QuickIterator qiter;
1372
1373 if (unlikely(MAKE_QUICK_ITERATOR(tstate, sequence, &qiter) == false)) {
1374 return NULL;
1375 }
1376
1377 PyObject *result;
1378
1379 long int_result = 0;
1380
1381 PyObject *item;
1382
1383 for (;;) {
1384 bool finished;
1385
1386 item = QUICK_ITERATOR_NEXT(tstate, &qiter, &finished);
1387
1388 if (finished) {
1389 return Nuitka_PyInt_FromLong(int_result);
1390 } else if (item == NULL) {
1391 return NULL;
1392 }
1393
1394 CHECK_OBJECT(item);
1395
1396// For Python2 int objects:
1397#if PYTHON_VERSION < 0x300
1398 if (PyInt_CheckExact(item)) {
1399 long b = PyInt_AS_LONG(item);
1400 long x = int_result + b;
1401
1402 if ((x ^ int_result) >= 0 || (x ^ b) >= 0) {
1403 int_result = x;
1404 Py_DECREF(item);
1405
1406 continue;
1407 }
1408 }
1409#endif
1410
1411// For Python2 long, Python3 int objects
1412#if PYTHON_VERSION >= 0x270
1413 if (PyLong_CheckExact(item)) {
1414 int overflow;
1415 long b = PyLong_AsLongAndOverflow(item, &overflow);
1416
1417 if (overflow) {
1418 break;
1419 }
1420
1421 long x = int_result + b;
1422
1423 if ((x ^ int_result) >= 0 || (x ^ b) >= 0) {
1424 int_result = x;
1425 Py_DECREF(item);
1426
1427 continue;
1428 }
1429 }
1430#endif
1431
1432 if (item == Py_False) {
1433 Py_DECREF_IMMORTAL(item);
1434 continue;
1435 }
1436
1437 if (item == Py_True) {
1438 long b = 1;
1439 long x = int_result + b;
1440
1441 if ((x ^ int_result) >= 0 || (x ^ b) >= 0) {
1442 int_result = x;
1443 Py_DECREF(item);
1444
1445 continue;
1446 }
1447 }
1448
1449 /* Either overflowed or not one of the supported int alike types. */
1450 break;
1451 }
1452
1453 /* Switch over to objects, and redo last step. */
1454 result = Nuitka_PyInt_FromLong(int_result);
1455 CHECK_OBJECT(result);
1456
1457 PyObject *temp = PyNumber_Add(result, item);
1458 Py_DECREF(result);
1459 Py_DECREF(item);
1460 result = temp;
1461
1462 if (unlikely(result == NULL)) {
1463 return NULL;
1464 }
1465
1466 for (;;) {
1467 CHECK_OBJECT(result);
1468
1469 bool finished;
1470 item = QUICK_ITERATOR_NEXT(tstate, &qiter, &finished);
1471
1472 if (finished) {
1473 break;
1474 } else if (item == NULL) {
1475 Py_DECREF(result);
1476 return NULL;
1477 }
1478
1479 CHECK_OBJECT(item);
1480
1481 PyObject *temp2 = PyNumber_Add(result, item);
1482
1483 Py_DECREF(item);
1484 Py_DECREF(result);
1485
1486 if (unlikely(temp2 == NULL)) {
1487 return NULL;
1488 }
1489
1490 result = temp2;
1491 }
1492
1493 CHECK_OBJECT(result);
1494
1495 return result;
1496}
1497
1498NUITKA_DEFINE_BUILTIN(sum);
1499
1500PyObject *BUILTIN_SUM2(PyThreadState *tstate, PyObject *sequence, PyObject *start) {
1501 NUITKA_ASSIGN_BUILTIN(sum);
1502
1503 CHECK_OBJECT(sequence);
1504 CHECK_OBJECT(start);
1505
1506 PyObject *pos_args = MAKE_TUPLE2(tstate, sequence, start);
1507
1508 PyObject *result = CALL_FUNCTION_WITH_POS_ARGS2(tstate, NUITKA_ACCESS_BUILTIN(sum), pos_args);
1509
1510 Py_DECREF(pos_args);
1511
1512 return result;
1513}
1514
1515PyDictObject *dict_builtin = NULL;
1516PyModuleObject *builtin_module = NULL;
1517
1518static PyTypeObject Nuitka_BuiltinModule_Type = {
1519 PyVarObject_HEAD_INIT(NULL, 0) "compiled_module", // tp_name
1520 sizeof(PyModuleObject), // tp_size
1521};
1522
1523int Nuitka_BuiltinModule_SetAttr(PyModuleObject *module, PyObject *name, PyObject *value) {
1524 CHECK_OBJECT(module);
1525 CHECK_OBJECT(name);
1526
1527 // This is used for "del" as well.
1528 assert(value == NULL || Py_REFCNT(value) > 0);
1529
1530 // only checks the builtins that we can refresh at this time, if we have
1531 // many value to check maybe need create a dict first.
1532 bool found = false;
1533
1534 int res = PyObject_RichCompareBool(name, const_str_plain_open, Py_EQ);
1535
1536 if (unlikely(res == -1)) {
1537 return -1;
1538 }
1539 if (res == 1) {
1540 NUITKA_UPDATE_BUILTIN(open, value);
1541 found = true;
1542 }
1543
1544 if (found == false) {
1545 res = PyObject_RichCompareBool(name, const_str_plain___import__, Py_EQ);
1546
1547 if (unlikely(res == -1)) {
1548 return -1;
1549 }
1550
1551 if (res == 1) {
1552 NUITKA_UPDATE_BUILTIN(__import__, value);
1553 found = true;
1554 }
1555 }
1556
1557#if PYTHON_VERSION >= 0x300
1558 if (found == false) {
1559 res = PyObject_RichCompareBool(name, const_str_plain_print, Py_EQ);
1560
1561 if (unlikely(res == -1)) {
1562 return -1;
1563 }
1564
1565 if (res == 1) {
1566 NUITKA_UPDATE_BUILTIN(print, value);
1567 found = true;
1568 }
1569 }
1570#endif
1571
1572 if (found == false) {
1573 res = PyObject_RichCompareBool(name, const_str_plain_super, Py_EQ);
1574
1575 if (unlikely(res == -1)) {
1576 return -1;
1577 }
1578
1579 if (res == 1) {
1580 NUITKA_UPDATE_BUILTIN(super, value);
1581 found = true;
1582 }
1583 }
1584
1585 return PyObject_GenericSetAttr((PyObject *)module, name, value);
1586}
1587
1588#if defined(__FreeBSD__) || defined(__OpenBSD__)
1589#include <sys/sysctl.h>
1590#endif
1591
1592static PyObject *getPathSeparatorStringObject(void) {
1593 static char const sep[2] = {SEP, 0};
1594
1595 static PyObject *sep_str = NULL;
1596
1597 if (sep_str == NULL) {
1598 sep_str = Nuitka_String_FromString(sep);
1599 }
1600
1601 CHECK_OBJECT(sep_str);
1602
1603 return sep_str;
1604}
1605
1606PyObject *JOIN_PATH2(PyObject *dirname, PyObject *filename) {
1607 CHECK_OBJECT(dirname);
1608 CHECK_OBJECT(filename);
1609
1610 // Avoid string APIs, so str, unicode doesn't matter for input.
1611 PyObject *result = dirname;
1612
1613 if (dirname != const_str_empty) {
1614 result = PyNumber_InPlaceAdd(result, getPathSeparatorStringObject());
1615 CHECK_OBJECT(result);
1616 }
1617
1618 result = PyNumber_InPlaceAdd(result, filename);
1619 CHECK_OBJECT(result);
1620
1621 return result;
1622}
1623
1624#if _NUITKA_EXE_MODE || _NUITKA_DLL_MODE
1625
1626wchar_t const *getBinaryDirectoryWideChars(bool resolve_symlinks) {
1627 static wchar_t binary_directory[MAXPATHLEN + 1];
1628 static bool init_done = false;
1629
1630 if (init_done == false) {
1631 binary_directory[0] = 0;
1632
1633#if defined(_WIN32)
1634 copyStringSafeW(binary_directory, getBinaryFilenameWideChars(resolve_symlinks),
1635 sizeof(binary_directory) / sizeof(wchar_t));
1636
1637 stripFilenameW(binary_directory);
1638 makeShortFilename(binary_directory, sizeof(binary_directory) / sizeof(wchar_t));
1639#else
1640 appendStringSafeW(binary_directory, getBinaryDirectoryHostEncoded(true),
1641 sizeof(binary_directory) / sizeof(wchar_t));
1642#endif
1643
1644 init_done = true;
1645 }
1646 return (wchar_t const *)binary_directory;
1647}
1648
1649#if defined(_WIN32)
1650char const *getBinaryDirectoryHostEncoded(bool resolve_symlinks) {
1651 static char *binary_directory = NULL;
1652 static char *binary_directory_resolved = NULL;
1653
1654 char *binary_directory_target;
1655
1656 if (resolve_symlinks) {
1657 binary_directory_target = binary_directory_resolved;
1658 } else {
1659 binary_directory_target = binary_directory;
1660 }
1661
1662 if (binary_directory_target != NULL) {
1663 return binary_directory_target;
1664 }
1665 wchar_t const *w = getBinaryDirectoryWideChars(resolve_symlinks);
1666
1667 DWORD bufsize = WideCharToMultiByte(CP_ACP, 0, w, -1, NULL, 0, NULL, NULL);
1668 assert(bufsize != 0);
1669
1670 binary_directory_target = (char *)malloc(bufsize + 1);
1671 assert(binary_directory_target);
1672
1673 DWORD res2 = WideCharToMultiByte(CP_ACP, 0, w, -1, binary_directory_target, bufsize, NULL, NULL);
1674 assert(res2 != 0);
1675
1676 if (unlikely(res2 > bufsize)) {
1677 abort();
1678 }
1679
1680 return (char const *)binary_directory_target;
1681}
1682
1683#else
1684
1685char const *getBinaryDirectoryHostEncoded(bool resolve_symlinks) {
1686 const int buffer_size = MAXPATHLEN + 1;
1687
1688 static char binary_directory[MAXPATHLEN + 1] = {0};
1689 static char binary_directory_resolved[MAXPATHLEN + 1] = {0};
1690
1691 char *binary_directory_target;
1692
1693 if (resolve_symlinks) {
1694 binary_directory_target = binary_directory_resolved;
1695 } else {
1696 binary_directory_target = binary_directory;
1697 }
1698
1699 if (*binary_directory_target != 0) {
1700 return binary_directory_target;
1701 }
1702
1703 // Get the filename first.
1704 copyStringSafe(binary_directory_target, getBinaryFilenameHostEncoded(resolve_symlinks), buffer_size);
1705
1706 // We want the directory name, the above gives the full executable name.
1707 copyStringSafe(binary_directory_target, dirname(binary_directory_target), buffer_size);
1708
1709 return binary_directory_target;
1710}
1711
1712#endif
1713
1714#if _NUITKA_EXE_MODE || _NUITKA_ONEFILE_DLL_MODE
1715PyObject *getBinaryFilenameObject(bool resolve_symlinks) {
1716 static PyObject *binary_filename = NULL;
1717 static PyObject *binary_filename_resolved = NULL;
1718
1719 PyObject **binary_object_target;
1720
1721 if (resolve_symlinks) {
1722 binary_object_target = &binary_filename_resolved;
1723 } else {
1724 binary_object_target = &binary_filename;
1725 }
1726
1727 if (*binary_object_target != NULL) {
1728 CHECK_OBJECT(*binary_object_target);
1729
1730 return *binary_object_target;
1731 }
1732
1733// On Python3, this must be a unicode object, it cannot be on Python2,
1734// there e.g. code objects expect Python2 strings.
1735#if PYTHON_VERSION >= 0x300
1736#ifdef _WIN32
1737 wchar_t const *exe_filename = getBinaryFilenameWideChars(resolve_symlinks);
1738 *binary_object_target = NuitkaUnicode_FromWideChar(exe_filename, -1);
1739#else
1740 *binary_object_target = PyUnicode_DecodeFSDefault(getBinaryFilenameHostEncoded(resolve_symlinks));
1741#endif
1742#else
1743 *binary_object_target = PyString_FromString(getBinaryFilenameHostEncoded(resolve_symlinks));
1744#endif
1745
1746 if (unlikely(*binary_object_target == NULL)) {
1747 PyErr_Print();
1748 abort();
1749 }
1750
1751 // Make sure it's usable for caching.
1752 Py_INCREF(*binary_object_target);
1753
1754 return *binary_object_target;
1755}
1756#endif
1757
1758PyObject *getBinaryDirectoryObject(bool resolve_symlinks) {
1759 static PyObject *binary_directory = NULL;
1760 static PyObject *binary_directory_resolved = NULL;
1761
1762 PyObject **binary_object_target;
1763
1764 if (resolve_symlinks) {
1765 binary_object_target = &binary_directory_resolved;
1766 } else {
1767 binary_object_target = &binary_directory;
1768 }
1769
1770 if (*binary_object_target != NULL) {
1771 CHECK_OBJECT(*binary_object_target);
1772
1773 return *binary_object_target;
1774 }
1775
1776// On Python3, this must be a unicode object, it cannot be on Python2,
1777// there e.g. code objects expect Python2 strings.
1778#if PYTHON_VERSION >= 0x300
1779#ifdef _WIN32
1780 wchar_t const *bin_directory = getBinaryDirectoryWideChars(resolve_symlinks);
1781 *binary_object_target = NuitkaUnicode_FromWideChar(bin_directory, -1);
1782#else
1783 *binary_object_target = PyUnicode_DecodeFSDefault(getBinaryDirectoryHostEncoded(resolve_symlinks));
1784#endif
1785#else
1786 *binary_object_target = PyString_FromString(getBinaryDirectoryHostEncoded(resolve_symlinks));
1787#endif
1788
1789 if (unlikely(*binary_object_target == NULL)) {
1790 PyErr_Print();
1791 abort();
1792 }
1793
1794 // Make sure it's usable for caching.
1795 Py_INCREF(*binary_object_target);
1796
1797 return *binary_object_target;
1798}
1799#endif
1800
1801#if _NUITKA_DLL_MODE || _NUITKA_MODULE_MODE
1802static PyObject *getDllDirectoryObject(void) {
1803 static PyObject *dll_directory = NULL;
1804
1805 if (dll_directory == NULL) {
1806 filename_char_t const *dll_directory_filename = getDllDirectory();
1807
1808 dll_directory = Nuitka_String_FromFilename(dll_directory_filename);
1809
1810#if PYTHON_VERSION < 0x300
1811 // Avoid unnecessary unicode values.
1812 PyObject *decoded_dll_directory = PyObject_Str(dll_directory);
1813
1814 if (decoded_dll_directory == NULL) {
1815 PyThreadState *tstate = PyThreadState_GET();
1816 DROP_ERROR_OCCURRED(tstate);
1817 } else {
1818 Py_DECREF(dll_directory);
1819 dll_directory = decoded_dll_directory;
1820 }
1821#endif
1822 }
1823
1824 CHECK_OBJECT(dll_directory);
1825
1826 return dll_directory;
1827}
1828
1829PyObject *getDllFilenameObject(void) {
1830 static PyObject *dll_filename = NULL;
1831
1832 if (dll_filename == NULL) {
1833 filename_char_t const *dll_filename_str = getDllFilename();
1834
1835 dll_filename = Nuitka_String_FromFilename(dll_filename_str);
1836
1837#if PYTHON_VERSION < 0x300
1838 // Avoid unnecessary unicode values.
1839 PyObject *decoded_dll_filename = PyObject_Str(dll_filename);
1840
1841 if (decoded_dll_filename == NULL) {
1842 PyThreadState *tstate = PyThreadState_GET();
1843 DROP_ERROR_OCCURRED(tstate);
1844 } else {
1845 Py_DECREF(dll_filename);
1846 dll_filename = decoded_dll_filename;
1847 }
1848#endif
1849 }
1850
1851 CHECK_OBJECT(dll_filename);
1852
1853 return dll_filename;
1854}
1855#endif
1856
1857PyObject *getPythonProgramDirectoryObject(bool resolve_symlinks) {
1858#if defined(_NUITKA_EXE_MODE)
1859 return getBinaryDirectoryObject(resolve_symlinks);
1860#else
1861 return getDllDirectoryObject();
1862#endif
1863}
1864
1865PyObject *getContainingDirectoryObject(bool resolve_symlinks) {
1866#if defined(_NUITKA_ONEFILE_MODE)
1867 environment_char_t const *onefile_directory = getEnvironmentVariable("NUITKA_ONEFILE_DIRECTORY");
1868 if (onefile_directory != NULL) {
1869 PyObject *result = Nuitka_String_FromFilename(onefile_directory);
1870 unsetEnvironmentVariable("NUITKA_ONEFILE_DIRECTORY");
1871
1872 return result;
1873 }
1874#endif
1875 return getPythonProgramDirectoryObject(resolve_symlinks);
1876}
1877
1878#if _NUITKA_STANDALONE_MODE
1879// Helper function to create path.
1880PyObject *getStandaloneSysExecutablePath(PyObject *basename) {
1881#if _NUITKA_EXE_MODE
1882 PyObject *dir_name = getBinaryDirectoryObject(false);
1883#else
1884 PyObject *dir_name = getDllDirectoryObject();
1885#endif
1886 PyObject *sys_executable = JOIN_PATH2(dir_name, basename);
1887
1888 return sys_executable;
1889}
1890#endif
1891
1892static void _initDeepCopy(void);
1893
1894void _initBuiltinModule(void) {
1895 NUITKA_PRINT_TRACE("main(): Calling _initBuiltinTypeMethods().");
1896 _initBuiltinTypeMethods();
1897 NUITKA_PRINT_TRACE("main(): Calling _initDeepCopy().");
1898 _initDeepCopy();
1899
1900#if _NUITKA_MODULE_MODE
1901 if (builtin_module != NULL) {
1902 return;
1903 }
1904#else
1905 assert(builtin_module == NULL);
1906#endif
1907
1908#if PYTHON_VERSION < 0x300
1909 builtin_module = (PyModuleObject *)PyImport_ImportModule("__builtin__");
1910#else
1911 builtin_module = (PyModuleObject *)PyImport_ImportModule("builtins");
1912#endif
1913 assert(builtin_module);
1914 dict_builtin = (PyDictObject *)builtin_module->md_dict;
1915 assert(PyDict_Check(dict_builtin));
1916
1917#if _NUITKA_STANDALONE_MODE
1918 {
1919#if _NUITKA_EXE_MODE
1920 PyObject *nuitka_binary_dir = getBinaryDirectoryObject(true);
1921#else
1922 PyObject *nuitka_binary_dir = getDllDirectoryObject();
1923#endif
1924 NUITKA_MAY_BE_UNUSED int res =
1925 PyDict_SetItemString((PyObject *)dict_builtin, "__nuitka_binary_dir", nuitka_binary_dir);
1926 assert(res == 0);
1927
1928 // For actual DLL mode, we don't have this, but the form used in onefile
1929 // will providing our own executable that knows what to do.
1930#if _NUITKA_EXE_MODE || _NUITKA_ONEFILE_DLL_MODE
1931 PyDict_SetItemString((PyObject *)dict_builtin, "__nuitka_binary_exe", getBinaryFilenameObject(true));
1932 assert(res == 0);
1933#endif
1934 }
1935#endif
1936
1937 // init Nuitka_BuiltinModule_Type, PyType_Ready won't copy all member from
1938 // base type, so we need copy all members from PyModule_Type manual for
1939 // safety. PyType_Ready will change tp_flags, we need define it again. Set
1940 // tp_setattro to Nuitka_BuiltinModule_SetAttr and we can detect value
1941 // change. Set tp_base to PyModule_Type and PyModule_Check will pass.
1942 Nuitka_BuiltinModule_Type.tp_dealloc = PyModule_Type.tp_dealloc;
1943 Nuitka_BuiltinModule_Type.tp_repr = PyModule_Type.tp_repr;
1944 Nuitka_BuiltinModule_Type.tp_setattro = (setattrofunc)Nuitka_BuiltinModule_SetAttr;
1945 Nuitka_BuiltinModule_Type.tp_getattro = PyModule_Type.tp_getattro;
1946 Nuitka_BuiltinModule_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE;
1947 Nuitka_BuiltinModule_Type.tp_doc = PyModule_Type.tp_doc;
1948 Nuitka_BuiltinModule_Type.tp_traverse = PyModule_Type.tp_traverse;
1949 Nuitka_BuiltinModule_Type.tp_members = PyModule_Type.tp_members;
1950 Nuitka_BuiltinModule_Type.tp_base = &PyModule_Type;
1951 Nuitka_BuiltinModule_Type.tp_dictoffset = PyModule_Type.tp_dictoffset;
1952 Nuitka_BuiltinModule_Type.tp_init = PyModule_Type.tp_init;
1953 Nuitka_BuiltinModule_Type.tp_alloc = PyModule_Type.tp_alloc;
1954 Nuitka_BuiltinModule_Type.tp_new = PyModule_Type.tp_new;
1955 Nuitka_BuiltinModule_Type.tp_free = PyModule_Type.tp_free;
1956 NUITKA_MAY_BE_UNUSED int res2 = PyType_Ready(&Nuitka_BuiltinModule_Type);
1957 assert(res2 >= 0);
1958
1959 // Replace type of builtin module to take over.
1960 ((PyObject *)builtin_module)->ob_type = &Nuitka_BuiltinModule_Type;
1961 assert(PyModule_Check(builtin_module) == 1);
1962}
1963
1964#include "HelpersCalling.c"
1965
1966PyObject *MAKE_RELATIVE_PATH(PyObject *relative) {
1967 CHECK_OBJECT(relative);
1968
1969 static PyObject *our_path_object = NULL;
1970
1971 if (our_path_object == NULL) {
1972 our_path_object = getPythonProgramDirectoryObject(true);
1973 }
1974
1975 return JOIN_PATH2(our_path_object, relative);
1976}
1977
1978#if !_NUITKA_MODULE_MODE
1979
1980NUITKA_DEFINE_BUILTIN(type)
1981NUITKA_DEFINE_BUILTIN(len)
1982NUITKA_DEFINE_BUILTIN(repr)
1983NUITKA_DEFINE_BUILTIN(int)
1984NUITKA_DEFINE_BUILTIN(iter)
1985#if PYTHON_VERSION < 0x300
1986NUITKA_DEFINE_BUILTIN(long)
1987#else
1988NUITKA_DEFINE_BUILTIN(range);
1989#endif
1990
1991void _initBuiltinOriginalValues(void) {
1992 NUITKA_ASSIGN_BUILTIN(type);
1993 NUITKA_ASSIGN_BUILTIN(len);
1994 NUITKA_ASSIGN_BUILTIN(range);
1995 NUITKA_ASSIGN_BUILTIN(repr);
1996 NUITKA_ASSIGN_BUILTIN(int);
1997 NUITKA_ASSIGN_BUILTIN(iter);
1998#if PYTHON_VERSION < 0x300
1999 NUITKA_ASSIGN_BUILTIN(long);
2000#endif
2001
2002 CHECK_OBJECT(_python_original_builtin_value_range);
2003}
2004
2005#endif
2006
2007// Used for threading.
2008#if PYTHON_VERSION >= 0x300 && !defined(NUITKA_USE_PYCORE_THREAD_STATE)
2009volatile int _Py_Ticker = _Py_CheckInterval;
2010#endif
2011
2012#if PYTHON_VERSION >= 0x270
2013iternextfunc default_iternext;
2014
2015void _initSlotIterNext(void) {
2016 PyThreadState *tstate = PyThreadState_GET();
2017
2018 PyObject *pos_args = MAKE_TUPLE1(tstate, (PyObject *)&PyBaseObject_Type);
2019
2020 // Note: Not using MAKE_DICT_EMPTY on purpose, this is called early on.
2021 PyObject *kw_args = PyDict_New();
2022 PyDict_SetItem(kw_args, const_str_plain___iter__, Py_True);
2023
2024 PyObject *c =
2025 PyObject_CallFunctionObjArgs((PyObject *)&PyType_Type, const_str_plain___iter__, pos_args, kw_args, NULL);
2026 Py_DECREF(pos_args);
2027 Py_DECREF(kw_args);
2028
2029 PyObject *r = PyObject_CallFunctionObjArgs(c, NULL);
2030 Py_DECREF(c);
2031
2032 CHECK_OBJECT(r);
2033 assert(Py_TYPE(r)->tp_iternext);
2034
2035 default_iternext = Py_TYPE(r)->tp_iternext;
2036
2037 Py_DECREF(r);
2038}
2039#endif
2040
2041#if PYTHON_VERSION >= 0x3a0
2042PyObject *MAKE_UNION_TYPE(PyObject *args) {
2043 assert(PyTuple_CheckExact(args));
2044 assert(PyTuple_GET_SIZE(args) > 1);
2045
2046 CHECK_OBJECT_DEEP(args);
2047
2048 PyObject *result = NULL;
2049
2050 for (Py_ssize_t i = 0; i < PyTuple_GET_SIZE(args); i++) {
2051 PyObject *value = PyTuple_GET_ITEM(args, i);
2052
2053 if (result == NULL) {
2054 assert(i == 0);
2055 result = value;
2056 } else {
2057 result = PyNumber_InPlaceBitor(result, value);
2058 }
2059 }
2060
2061 return result;
2062}
2063#endif
2064
2065#include "HelpersAttributes.c"
2066#include "HelpersDeepcopy.c"
2067#include "HelpersOperationBinaryAdd.c"
2068#include "HelpersOperationBinaryBitand.c"
2069#include "HelpersOperationBinaryBitor.c"
2070#include "HelpersOperationBinaryBitxor.c"
2071#include "HelpersOperationBinaryDivmod.c"
2072#include "HelpersOperationBinaryFloordiv.c"
2073#include "HelpersOperationBinaryLshift.c"
2074#include "HelpersOperationBinaryMod.c"
2075#include "HelpersOperationBinaryMult.c"
2076#include "HelpersOperationBinaryPow.c"
2077#include "HelpersOperationBinaryRshift.c"
2078#include "HelpersOperationBinarySub.c"
2079#include "HelpersOperationBinaryTruediv.c"
2080#include "HelpersTypes.c"
2081#if PYTHON_VERSION < 0x300
2082#include "HelpersOperationBinaryOlddiv.c"
2083#endif
2084#if PYTHON_VERSION >= 0x350
2085#include "HelpersOperationBinaryMatmult.c"
2086#endif
2087
2088#include "HelpersOperationBinaryDualAdd.c"
2089
2090#include "HelpersOperationInplaceAdd.c"
2091#include "HelpersOperationInplaceBitand.c"
2092#include "HelpersOperationInplaceBitor.c"
2093#include "HelpersOperationInplaceBitxor.c"
2094#include "HelpersOperationInplaceFloordiv.c"
2095#include "HelpersOperationInplaceLshift.c"
2096#include "HelpersOperationInplaceMod.c"
2097#include "HelpersOperationInplaceMult.c"
2098#include "HelpersOperationInplacePow.c"
2099#include "HelpersOperationInplaceRshift.c"
2100#include "HelpersOperationInplaceSub.c"
2101#include "HelpersOperationInplaceTruediv.c"
2102#if PYTHON_VERSION < 0x300
2103#include "HelpersOperationInplaceOlddiv.c"
2104#endif
2105#if PYTHON_VERSION >= 0x350
2106#include "HelpersOperationInplaceMatmult.c"
2107#endif
2108
2109#include "HelpersComparisonEq.c"
2110#include "HelpersComparisonLe.c"
2111#include "HelpersComparisonLt.c"
2112
2113#include "HelpersComparisonGe.c"
2114#include "HelpersComparisonGt.c"
2115#include "HelpersComparisonNe.c"
2116
2117#include "HelpersComparisonDualEq.c"
2118#include "HelpersComparisonDualLe.c"
2119#include "HelpersComparisonDualLt.c"
2120
2121#include "HelpersComparisonDualGe.c"
2122#include "HelpersComparisonDualGt.c"
2123#include "HelpersComparisonDualNe.c"
2124
2125#include "HelpersChecksumTools.c"
2126#include "HelpersConstantsBlob.c"
2127
2128#if _NUITKA_PROFILE
2129#include "HelpersProfiling.c"
2130#endif
2131
2132#if _NUITKA_PGO_PYTHON
2133#include "HelpersPythonPgo.c"
2134#endif
2135
2136#include "MetaPathBasedLoader.c"
2137
2138#ifdef _NUITKA_EXPERIMENTAL_DUMP_C_TRACEBACKS
2139#include "HelpersDumpBacktraces.c"
2140#endif
2141
2142#ifdef _NUITKA_INLINE_COPY_HACL
2143#include "Hacl_Hash_SHA2.c"
2144#endif
2145
2146#include "HelpersJitSources.c"
2147
2148// Part of "Nuitka", an optimizing Python compiler that is compatible and
2149// integrates with CPython, but also works on its own.
2150//
2151// Licensed under the Apache License, Version 2.0 (the "License");
2152// you may not use this file except in compliance with the License.
2153// You may obtain a copy of the License at
2154//
2155// http://www.apache.org/licenses/LICENSE-2.0
2156//
2157// Unless required by applicable law or agreed to in writing, software
2158// distributed under the License is distributed on an "AS IS" BASIS,
2159// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2160// See the License for the specific language governing permissions and
2161// limitations under the License.
Definition exceptions.h:712
Definition compiled_generator.h:41
Definition CompiledCodeHelpers.c:1264
Definition helpers.h:10
Definition rangeobjects.h:38