Nuitka
The Python compiler
Loading...
Searching...
No Matches
tuples.h
1// Copyright 2025, Kay Hayen, mailto:kay.hayen@gmail.com find license text at end of file
2
3#ifndef __NUITKA_HELPER_TUPLES_H__
4#define __NUITKA_HELPER_TUPLES_H__
5
6// Like PyTuple_SET_ITEM, but takes a reference to the item.
7#define PyTuple_SET_ITEM0(tuple, index, value) \
8 { \
9 PyObject *tmp = value; \
10 Py_INCREF(tmp); \
11 PyTuple_SET_ITEM(tuple, index, tmp); \
12 }
13
14// Like PyTuple_SET_ITEM, but takes a reference to the immortal value pre 3.12
15#if PYTHON_VERSION < 0x3c0
16#define PyTuple_SET_ITEM_IMMORTAL(tuple, index, value) PyTuple_SET_ITEM0(tuple, index, value)
17#else
18#define PyTuple_SET_ITEM_IMMORTAL(tuple, index, value) PyTuple_SET_ITEM(tuple, index, value)
19#endif
20
21#if PYTHON_VERSION >= 0x3a0 && !defined(_NUITKA_EXPERIMENTAL_DISABLE_FREELIST_ALL)
22#define NUITKA_TUPLE_HAS_FREELIST 1
23// Make empty tuple, size > 0
24extern PyObject *MAKE_TUPLE_EMPTY(PyThreadState *tstate, Py_ssize_t size);
25// Make empty tuple, size >= 0
26extern PyObject *MAKE_TUPLE_EMPTY_VAR(PyThreadState *tstate, Py_ssize_t size);
27#else
28#define NUITKA_TUPLE_HAS_FREELIST 0
29
30// Make empty tuple, size > 0
31#define MAKE_TUPLE_EMPTY(tstate, size) PyTuple_New(size)
32// Make empty tuple, size >= 0
33#define MAKE_TUPLE_EMPTY_VAR(tstate, size) PyTuple_New(size)
34#endif
35
36NUITKA_MAY_BE_UNUSED static PyObject *MAKE_TUPLE(PyThreadState *tstate, PyObject *const *elements, Py_ssize_t size) {
37 assert(size > 0);
38 PyObject *result = MAKE_TUPLE_EMPTY(tstate, size);
39
40 for (Py_ssize_t i = 0; i < size; i++) {
41 PyTuple_SET_ITEM0(result, i, elements[i]);
42 }
43
44 return result;
45}
46
47NUITKA_MAY_BE_UNUSED static PyObject *MAKE_TUPLE_VAR(PyThreadState *tstate, PyObject *const *elements,
48 Py_ssize_t size) {
49 PyObject *result = MAKE_TUPLE_EMPTY_VAR(tstate, size);
50
51 for (Py_ssize_t i = 0; i < size; i++) {
52 PyTuple_SET_ITEM0(result, i, elements[i]);
53 }
54
55 return result;
56}
57
58NUITKA_MAY_BE_UNUSED static PyObject *MAKE_TUPLE1(PyThreadState *tstate, PyObject *element1) {
59 PyObject *result = MAKE_TUPLE_EMPTY(tstate, 1);
60
61 PyTuple_SET_ITEM0(result, 0, element1);
62
63 return result;
64}
65
66NUITKA_MAY_BE_UNUSED static PyObject *MAKE_TUPLE1_0(PyThreadState *tstate, PyObject *element1) {
67 PyObject *result = MAKE_TUPLE_EMPTY(tstate, 1);
68
69 PyTuple_SET_ITEM(result, 0, element1);
70
71 return result;
72}
73
74NUITKA_MAY_BE_UNUSED static PyObject *MAKE_TUPLE2(PyThreadState *tstate, PyObject *element1, PyObject *element2) {
75 PyObject *result = MAKE_TUPLE_EMPTY(tstate, 2);
76
77 PyTuple_SET_ITEM0(result, 0, element1);
78 PyTuple_SET_ITEM0(result, 1, element2);
79
80 return result;
81}
82
83NUITKA_MAY_BE_UNUSED static PyObject *MAKE_TUPLE2_0(PyThreadState *tstate, PyObject *element1, PyObject *element2) {
84 PyObject *result = MAKE_TUPLE_EMPTY(tstate, 2);
85
86 PyTuple_SET_ITEM(result, 0, element1);
87 PyTuple_SET_ITEM(result, 1, element2);
88
89 return result;
90}
91
92NUITKA_MAY_BE_UNUSED static PyObject *MAKE_TUPLE3(PyThreadState *tstate, PyObject *element1, PyObject *element2,
93 PyObject *element3) {
94 PyObject *result = MAKE_TUPLE_EMPTY(tstate, 3);
95
96 PyTuple_SET_ITEM0(result, 0, element1);
97 PyTuple_SET_ITEM0(result, 1, element2);
98 PyTuple_SET_ITEM0(result, 2, element3);
99
100 return result;
101}
102
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);
106
107 PyTuple_SET_ITEM(result, 0, element1);
108 PyTuple_SET_ITEM(result, 1, element2);
109 PyTuple_SET_ITEM(result, 2, element3);
110
111 return result;
112}
113
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);
117
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);
122
123 return result;
124}
125
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);
129
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);
134
135 return result;
136}
137
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);
141
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);
147
148 return result;
149}
150
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);
154
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);
160
161 return result;
162}
163
164// Make this new macro available for older Python too.
165#ifndef _PyTuple_ITEMS
166#define _PyTuple_ITEMS(op) (((PyTupleObject *)(op))->ob_item)
167#endif
168
169extern PyObject *TUPLE_CONCAT(PyThreadState *tstate, PyObject *tuple1, PyObject *tuple2);
170
171extern PyObject *TUPLE_COPY(PyThreadState *tstate, PyObject *tuple);
172
173#endif
174// Part of "Nuitka", an optimizing Python compiler that is compatible and
175// integrates with CPython, but also works on its own.
176//
177// Licensed under the Apache License, Version 2.0 (the "License");
178// you may not use this file except in compliance with the License.
179// You may obtain a copy of the License at
180//
181// http://www.apache.org/licenses/LICENSE-2.0
182//
183// Unless required by applicable law or agreed to in writing, software
184// distributed under the License is distributed on an "AS IS" BASIS,
185// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
186// See the License for the specific language governing permissions and
187// limitations under the License.