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 assert(elements != NULL);
39 CHECK_OBJECTS(elements, size);
41 PyObject *result = MAKE_TUPLE_EMPTY(tstate, size);
43 for (Py_ssize_t i = 0; i < size; i++) {
44 PyTuple_SET_ITEM0(result, i, elements[i]);
50NUITKA_MAY_BE_UNUSED
static PyObject *MAKE_TUPLE_VAR(PyThreadState *tstate, PyObject *
const *elements,
52 PyObject *result = MAKE_TUPLE_EMPTY_VAR(tstate, size);
54 for (Py_ssize_t i = 0; i < size; i++) {
55 PyTuple_SET_ITEM0(result, i, elements[i]);
61NUITKA_MAY_BE_UNUSED
static PyObject *MAKE_TUPLE1(PyThreadState *tstate, PyObject *element1) {
62 PyObject *result = MAKE_TUPLE_EMPTY(tstate, 1);
64 PyTuple_SET_ITEM0(result, 0, element1);
69NUITKA_MAY_BE_UNUSED
static PyObject *MAKE_TUPLE1_0(PyThreadState *tstate, PyObject *element1) {
70 PyObject *result = MAKE_TUPLE_EMPTY(tstate, 1);
72 PyTuple_SET_ITEM(result, 0, element1);
77NUITKA_MAY_BE_UNUSED
static PyObject *MAKE_TUPLE2(PyThreadState *tstate, PyObject *element1, PyObject *element2) {
78 PyObject *result = MAKE_TUPLE_EMPTY(tstate, 2);
80 PyTuple_SET_ITEM0(result, 0, element1);
81 PyTuple_SET_ITEM0(result, 1, element2);
86NUITKA_MAY_BE_UNUSED
static PyObject *MAKE_TUPLE2_0(PyThreadState *tstate, PyObject *element1, PyObject *element2) {
87 PyObject *result = MAKE_TUPLE_EMPTY(tstate, 2);
89 PyTuple_SET_ITEM(result, 0, element1);
90 PyTuple_SET_ITEM(result, 1, element2);
95NUITKA_MAY_BE_UNUSED
static PyObject *MAKE_TUPLE3(PyThreadState *tstate, PyObject *element1, PyObject *element2,
97 PyObject *result = MAKE_TUPLE_EMPTY(tstate, 3);
99 PyTuple_SET_ITEM0(result, 0, element1);
100 PyTuple_SET_ITEM0(result, 1, element2);
101 PyTuple_SET_ITEM0(result, 2, element3);
106NUITKA_MAY_BE_UNUSED
static PyObject *MAKE_TUPLE3_0(PyThreadState *tstate, PyObject *element1, PyObject *element2,
107 PyObject *element3) {
108 PyObject *result = MAKE_TUPLE_EMPTY(tstate, 3);
110 PyTuple_SET_ITEM(result, 0, element1);
111 PyTuple_SET_ITEM(result, 1, element2);
112 PyTuple_SET_ITEM(result, 2, element3);
117NUITKA_MAY_BE_UNUSED
static PyObject *MAKE_TUPLE4(PyThreadState *tstate, PyObject *element1, PyObject *element2,
118 PyObject *element3, PyObject *element4) {
119 PyObject *result = MAKE_TUPLE_EMPTY(tstate, 4);
121 PyTuple_SET_ITEM0(result, 0, element1);
122 PyTuple_SET_ITEM0(result, 1, element2);
123 PyTuple_SET_ITEM0(result, 2, element3);
124 PyTuple_SET_ITEM0(result, 3, element4);
129NUITKA_MAY_BE_UNUSED
static PyObject *MAKE_TUPLE4_0(PyThreadState *tstate, PyObject *element1, PyObject *element2,
130 PyObject *element3, PyObject *element4) {
131 PyObject *result = MAKE_TUPLE_EMPTY(tstate, 4);
133 PyTuple_SET_ITEM(result, 0, element1);
134 PyTuple_SET_ITEM(result, 1, element2);
135 PyTuple_SET_ITEM(result, 2, element3);
136 PyTuple_SET_ITEM(result, 3, element4);
141NUITKA_MAY_BE_UNUSED
static PyObject *MAKE_TUPLE5(PyThreadState *tstate, PyObject *element1, PyObject *element2,
142 PyObject *element3, PyObject *element4, PyObject *element5) {
143 PyObject *result = MAKE_TUPLE_EMPTY(tstate, 5);
145 PyTuple_SET_ITEM0(result, 0, element1);
146 PyTuple_SET_ITEM0(result, 1, element2);
147 PyTuple_SET_ITEM0(result, 2, element3);
148 PyTuple_SET_ITEM0(result, 3, element4);
149 PyTuple_SET_ITEM0(result, 4, element5);
154NUITKA_MAY_BE_UNUSED
static PyObject *MAKE_TUPLE5_0(PyThreadState *tstate, PyObject *element1, PyObject *element2,
155 PyObject *element3, PyObject *element4, PyObject *element5) {
156 PyObject *result = MAKE_TUPLE_EMPTY(tstate, 5);
158 PyTuple_SET_ITEM(result, 0, element1);
159 PyTuple_SET_ITEM(result, 1, element2);
160 PyTuple_SET_ITEM(result, 2, element3);
161 PyTuple_SET_ITEM(result, 3, element4);
162 PyTuple_SET_ITEM(result, 4, element5);
168#ifndef _PyTuple_ITEMS
169#define _PyTuple_ITEMS(op) (((PyTupleObject *)(op))->ob_item)
172extern PyObject *TUPLE_CONCAT(PyThreadState *tstate, PyObject *tuple1, PyObject *tuple2);
174extern PyObject *TUPLE_COPY(PyThreadState *tstate, PyObject *tuple);