3#ifndef __NUITKA_HELPER_TUPLES_H__
4#define __NUITKA_HELPER_TUPLES_H__
7#define PyTuple_SET_ITEM0(tuple, index, value) \
9 PyObject *tmp = value; \
11 PyTuple_SET_ITEM(tuple, index, tmp); \
15#if PYTHON_VERSION < 0x3c0
16#define PyTuple_SET_ITEM_IMMORTAL(tuple, index, value) PyTuple_SET_ITEM0(tuple, index, value)
18#define PyTuple_SET_ITEM_IMMORTAL(tuple, index, value) PyTuple_SET_ITEM(tuple, index, value)
21#if PYTHON_VERSION >= 0x3a0 && !defined(_NUITKA_EXPERIMENTAL_DISABLE_FREELIST_ALL)
22#define NUITKA_TUPLE_HAS_FREELIST 1
24extern PyObject *MAKE_TUPLE_EMPTY(PyThreadState *tstate, Py_ssize_t size);
26extern PyObject *MAKE_TUPLE_EMPTY_VAR(PyThreadState *tstate, Py_ssize_t size);
28#define NUITKA_TUPLE_HAS_FREELIST 0
31#define MAKE_TUPLE_EMPTY(tstate, size) PyTuple_New(size)
33#define MAKE_TUPLE_EMPTY_VAR(tstate, size) PyTuple_New(size)
36NUITKA_MAY_BE_UNUSED
static PyObject *MAKE_TUPLE(PyThreadState *tstate, PyObject *
const *elements, Py_ssize_t size) {
38 PyObject *result = MAKE_TUPLE_EMPTY(tstate, size);
40 for (Py_ssize_t i = 0; i < size; i++) {
41 PyTuple_SET_ITEM0(result, i, elements[i]);
47NUITKA_MAY_BE_UNUSED
static PyObject *MAKE_TUPLE_VAR(PyThreadState *tstate, PyObject *
const *elements,
49 PyObject *result = MAKE_TUPLE_EMPTY_VAR(tstate, size);
51 for (Py_ssize_t i = 0; i < size; i++) {
52 PyTuple_SET_ITEM0(result, i, elements[i]);
58NUITKA_MAY_BE_UNUSED
static PyObject *MAKE_TUPLE1(PyThreadState *tstate, PyObject *element1) {
59 PyObject *result = MAKE_TUPLE_EMPTY(tstate, 1);
61 PyTuple_SET_ITEM0(result, 0, element1);
66NUITKA_MAY_BE_UNUSED
static PyObject *MAKE_TUPLE1_0(PyThreadState *tstate, PyObject *element1) {
67 PyObject *result = MAKE_TUPLE_EMPTY(tstate, 1);
69 PyTuple_SET_ITEM(result, 0, element1);
74NUITKA_MAY_BE_UNUSED
static PyObject *MAKE_TUPLE2(PyThreadState *tstate, PyObject *element1, PyObject *element2) {
75 PyObject *result = MAKE_TUPLE_EMPTY(tstate, 2);
77 PyTuple_SET_ITEM0(result, 0, element1);
78 PyTuple_SET_ITEM0(result, 1, element2);
83NUITKA_MAY_BE_UNUSED
static PyObject *MAKE_TUPLE2_0(PyThreadState *tstate, PyObject *element1, PyObject *element2) {
84 PyObject *result = MAKE_TUPLE_EMPTY(tstate, 2);
86 PyTuple_SET_ITEM(result, 0, element1);
87 PyTuple_SET_ITEM(result, 1, element2);
92NUITKA_MAY_BE_UNUSED
static PyObject *MAKE_TUPLE3(PyThreadState *tstate, PyObject *element1, PyObject *element2,
94 PyObject *result = MAKE_TUPLE_EMPTY(tstate, 3);
96 PyTuple_SET_ITEM0(result, 0, element1);
97 PyTuple_SET_ITEM0(result, 1, element2);
98 PyTuple_SET_ITEM0(result, 2, element3);
103NUITKA_MAY_BE_UNUSED
static PyObject *MAKE_TUPLE3_0(PyThreadState *tstate, PyObject *element1, PyObject *element2,
104 PyObject *element3) {
105 PyObject *result = MAKE_TUPLE_EMPTY(tstate, 3);
107 PyTuple_SET_ITEM(result, 0, element1);
108 PyTuple_SET_ITEM(result, 1, element2);
109 PyTuple_SET_ITEM(result, 2, element3);
114NUITKA_MAY_BE_UNUSED
static PyObject *MAKE_TUPLE4(PyThreadState *tstate, PyObject *element1, PyObject *element2,
115 PyObject *element3, PyObject *element4) {
116 PyObject *result = MAKE_TUPLE_EMPTY(tstate, 4);
118 PyTuple_SET_ITEM0(result, 0, element1);
119 PyTuple_SET_ITEM0(result, 1, element2);
120 PyTuple_SET_ITEM0(result, 2, element3);
121 PyTuple_SET_ITEM0(result, 3, element4);
126NUITKA_MAY_BE_UNUSED
static PyObject *MAKE_TUPLE4_0(PyThreadState *tstate, PyObject *element1, PyObject *element2,
127 PyObject *element3, PyObject *element4) {
128 PyObject *result = MAKE_TUPLE_EMPTY(tstate, 4);
130 PyTuple_SET_ITEM(result, 0, element1);
131 PyTuple_SET_ITEM(result, 1, element2);
132 PyTuple_SET_ITEM(result, 2, element3);
133 PyTuple_SET_ITEM(result, 3, element4);
138NUITKA_MAY_BE_UNUSED
static PyObject *MAKE_TUPLE5(PyThreadState *tstate, PyObject *element1, PyObject *element2,
139 PyObject *element3, PyObject *element4, PyObject *element5) {
140 PyObject *result = MAKE_TUPLE_EMPTY(tstate, 5);
142 PyTuple_SET_ITEM0(result, 0, element1);
143 PyTuple_SET_ITEM0(result, 1, element2);
144 PyTuple_SET_ITEM0(result, 2, element3);
145 PyTuple_SET_ITEM0(result, 3, element4);
146 PyTuple_SET_ITEM0(result, 4, element5);
151NUITKA_MAY_BE_UNUSED
static PyObject *MAKE_TUPLE5_0(PyThreadState *tstate, PyObject *element1, PyObject *element2,
152 PyObject *element3, PyObject *element4, PyObject *element5) {
153 PyObject *result = MAKE_TUPLE_EMPTY(tstate, 5);
155 PyTuple_SET_ITEM(result, 0, element1);
156 PyTuple_SET_ITEM(result, 1, element2);
157 PyTuple_SET_ITEM(result, 2, element3);
158 PyTuple_SET_ITEM(result, 3, element4);
159 PyTuple_SET_ITEM(result, 4, element5);
165#ifndef _PyTuple_ITEMS
166#define _PyTuple_ITEMS(op) (((PyTupleObject *)(op))->ob_item)
169extern PyObject *TUPLE_CONCAT(PyThreadState *tstate, PyObject *tuple1, PyObject *tuple2);
171extern PyObject *TUPLE_COPY(PyThreadState *tstate, PyObject *tuple);