3#ifndef __NUITKA_HELPER_INTS_H__
4#define __NUITKA_HELPER_INTS_H__
7extern PyObject *Nuitka_PyLong_FromLong(
long ival);
10#if PYTHON_VERSION >= 0x300
11#define Nuitka_PyInt_FromLong(ival) Nuitka_PyLong_FromLong(ival)
13#define Nuitka_PyInt_FromLong(ival) PyInt_FromLong(ival)
20 NUITKA_ILONG_UNASSIGNED = 0,
21 NUITKA_ILONG_OBJECT_VALID = 1,
22 NUITKA_ILONG_CLONG_VALID = 2,
23 NUITKA_ILONG_BOTH_VALID = 3,
24 NUITKA_ILONG_EXCEPTION = 4
25} nuitka_ilong_validity;
28 nuitka_ilong_validity validity;
30 PyObject *python_value;
34#define IS_NILONG_OBJECT_VALUE_VALID(value) (((value)->validity & NUITKA_ILONG_OBJECT_VALID) != 0)
35#define IS_NILONG_C_VALUE_VALID(value) (((value)->validity & NUITKA_ILONG_CLONG_VALID) != 0)
37NUITKA_MAY_BE_UNUSED
static void SET_NILONG_OBJECT_VALUE(
nuitka_ilong *dual_value, PyObject *python_value) {
38 dual_value->validity = NUITKA_ILONG_OBJECT_VALID;
39 dual_value->python_value = python_value;
42NUITKA_MAY_BE_UNUSED
static void SET_NILONG_C_VALUE(
nuitka_ilong *dual_value,
long c_value) {
43 dual_value->validity = NUITKA_ILONG_CLONG_VALID;
44 dual_value->c_value = c_value;
47NUITKA_MAY_BE_UNUSED
static void SET_NILONG_OBJECT_AND_C_VALUE(
nuitka_ilong *dual_value, PyObject *python_value,
49 dual_value->validity = NUITKA_ILONG_BOTH_VALID;
50 dual_value->python_value = python_value;
51 dual_value->c_value = c_value;
54NUITKA_MAY_BE_UNUSED
static void RELEASE_NILONG_VALUE(
nuitka_ilong *dual_value) {
55 if (IS_NILONG_OBJECT_VALUE_VALID(dual_value)) {
56 CHECK_OBJECT(dual_value);
57 Py_DECREF(dual_value->python_value);
60 dual_value->validity = NUITKA_ILONG_UNASSIGNED;
63NUITKA_MAY_BE_UNUSED
static void INCREF_NILONG_VALUE(
nuitka_ilong *dual_value) {
64 if (IS_NILONG_OBJECT_VALUE_VALID(dual_value)) {
65 CHECK_OBJECT(dual_value);
66 Py_INCREF(dual_value->python_value);
70NUITKA_MAY_BE_UNUSED
static long GET_NILONG_C_VALUE(
nuitka_ilong const *dual_value) {
71 assert(IS_NILONG_C_VALUE_VALID(dual_value));
72 return dual_value->c_value;
75NUITKA_MAY_BE_UNUSED
static PyObject *GET_NILONG_OBJECT_VALUE(
nuitka_ilong const *dual_value) {
76 assert(IS_NILONG_OBJECT_VALUE_VALID(dual_value));
77 return dual_value->python_value;
80NUITKA_MAY_BE_UNUSED
static void ENFORCE_NILONG_OBJECT_VALUE(
nuitka_ilong *dual_value) {
81 assert(dual_value->validity != NUITKA_ILONG_UNASSIGNED);
83 if (!IS_NILONG_OBJECT_VALUE_VALID(dual_value)) {
84 dual_value->python_value = Nuitka_PyLong_FromLong(dual_value->c_value);
86 dual_value->validity = NUITKA_ILONG_BOTH_VALID;
90NUITKA_MAY_BE_UNUSED
static void CHECK_NILONG_OBJECT(
nuitka_ilong const *dual_value) {
91 assert(dual_value->validity != NUITKA_ILONG_UNASSIGNED);
93 if (IS_NILONG_OBJECT_VALUE_VALID(dual_value)) {
94 CHECK_OBJECT(dual_value);
98NUITKA_MAY_BE_UNUSED
static void PRINT_NILONG(
nuitka_ilong const *dual_value) {
99 PRINT_FORMAT(
"NILONG: %d", dual_value->validity);
100 if (IS_NILONG_C_VALUE_VALID(dual_value)) {
101 PRINT_FORMAT(
"C=%d", dual_value->c_value);
103 if (IS_NILONG_OBJECT_VALUE_VALID(dual_value)) {
104 PRINT_STRING(
"Python=");
105 PRINT_ITEM(dual_value->python_value);
109#if PYTHON_VERSION < 0x3c0
112typedef long medium_result_value_t;
113#define MEDIUM_VALUE(x) \
114 (Py_SIZE(x) < 0 ? -(sdigit)((PyLongObject *)(x))->ob_digit[0] \
115 : (Py_SIZE(x) == 0 ? (sdigit)0 : (sdigit)((PyLongObject *)(x))->ob_digit[0]))
118typedef stwodigits medium_result_value_t;
119#define MEDIUM_VALUE(x) ((stwodigits)_PyLong_CompactValue((PyLongObject *)x))
124#define NUITKA_STATIC_SMALLINT_VALUE_MIN -5
125#define NUITKA_STATIC_SMALLINT_VALUE_MAX 257
127#define NUITKA_TO_SMALL_VALUE_OFFSET(value) (value - NUITKA_STATIC_SMALLINT_VALUE_MIN)
129#if PYTHON_VERSION < 0x3b0
131#if PYTHON_VERSION >= 0x300
133#if PYTHON_VERSION >= 0x390
134extern PyObject **Nuitka_Long_SmallValues;
136extern PyObject *Nuitka_Long_SmallValues[NUITKA_STATIC_SMALLINT_VALUE_MAX - NUITKA_STATIC_SMALLINT_VALUE_MIN + 1];
139NUITKA_MAY_BE_UNUSED
static inline PyObject *Nuitka_Long_GetSmallValue(
int ival) {
140 return Nuitka_Long_SmallValues[NUITKA_TO_SMALL_VALUE_OFFSET(ival)];
146NUITKA_MAY_BE_UNUSED
static inline PyObject *Nuitka_Long_GetSmallValue(medium_result_value_t ival) {
147 return (PyObject *)&_PyLong_SMALL_INTS[NUITKA_TO_SMALL_VALUE_OFFSET(ival)];