10#include "nuitka/prelude.h"
13#if NUITKA_TUPLE_HAS_FREELIST
15PyObject *MAKE_TUPLE_EMPTY(PyThreadState *tstate, Py_ssize_t size) {
16 PyTupleObject *result_tuple;
21#if PYTHON_VERSION >= 0x3e0
22 Py_ssize_t index = size - 1;
24 if (index < PyTuple_MAXSAVESIZE) {
25 result_tuple = (PyTupleObject *)Nuitka_PyFreeList_Pop(&_Py_freelists_GET()->tuples[index]);
30 if (result_tuple == NULL) {
31 result_tuple = (PyTupleObject *)Nuitka_GC_NewVar(&PyTuple_Type, size);
33 _PyTuple_RESET_HASH_CACHE(result_tuple);
34 Nuitka_Py_NewReference((PyObject *)result_tuple);
38#if PYTHON_VERSION < 0x3d0
39 PyTupleObject **items = tstate->interp->tuple.free_list;
40 int *numfree = tstate->interp->tuple.numfree;
42 struct _Py_object_freelists *freelists = _Nuitka_object_freelists_GET(tstate);
43 struct _Py_tuple_freelist *state = &freelists->tuples;
44 PyTupleObject **items = state->items;
45 int *numfree = state->numfree;
48#if PYTHON_VERSION < 0x3b0
49 Py_ssize_t index = size;
51 Py_ssize_t index = size - 1;
54 if ((size < PyTuple_MAXSAVESIZE) && (result_tuple = items[index]) != NULL) {
55 items[index] = (PyTupleObject *)result_tuple->ob_item[0];
58 assert(Py_SIZE(result_tuple) == size);
59 assert(Py_TYPE(result_tuple) == &PyTuple_Type);
61 Nuitka_Py_NewReference((PyObject *)result_tuple);
65 ((
size_t)PY_SSIZE_T_MAX - (
sizeof(PyTupleObject) -
sizeof(PyObject *))) /
sizeof(PyObject *)) {
66 return PyErr_NoMemory();
69 result_tuple = (PyTupleObject *)Nuitka_GC_NewVar(&PyTuple_Type, size);
78 for (Py_ssize_t i = 0; i < size; i++) {
79 result_tuple->ob_item[i] = NULL;
82 Nuitka_GC_Track(result_tuple);
84 assert(PyTuple_CheckExact(result_tuple));
85 assert(PyTuple_GET_SIZE(result_tuple) == size);
87 return (PyObject *)result_tuple;
90PyObject *MAKE_TUPLE_EMPTY_VAR(PyThreadState *tstate, Py_ssize_t size) {
92 PyObject *result = const_tuple_empty;
96 return MAKE_TUPLE_EMPTY(tstate, size);
102PyObject *TUPLE_CONCAT(PyThreadState *tstate, PyObject *tuple1, PyObject *tuple2) {
103 Py_ssize_t size = Py_SIZE(tuple1) + Py_SIZE(tuple2);
106 PyTupleObject *result = (PyTupleObject *)MAKE_TUPLE_EMPTY_VAR(tstate, size);
107 if (unlikely(result == NULL)) {
111 PyObject **src = ((PyTupleObject *)tuple1)->ob_item;
112 PyObject **dest = result->ob_item;
114 for (Py_ssize_t i = 0; i < Py_SIZE(tuple1); i++) {
115 PyObject *v = src[i];
120 src = ((PyTupleObject *)tuple2)->ob_item;
121 dest = result->ob_item + Py_SIZE(tuple1);
123 for (Py_ssize_t i = 0; i < Py_SIZE(tuple2); i++) {
124 PyObject *v = src[i];
129 return (PyObject *)result;
132PyObject *TUPLE_COPY(PyThreadState *tstate, PyObject *tuple) {
134 assert(PyTuple_CheckExact(tuple));
136 Py_ssize_t size = PyTuple_GET_SIZE(tuple);
137 PyObject *result = MAKE_TUPLE_EMPTY_VAR(tstate, size);
139 if (unlikely(result == NULL)) {
143 for (Py_ssize_t i = 0; i < size; i++) {
144 PyObject *item = PyTuple_GET_ITEM(tuple, i);
146 PyList_SET_ITEM(result, i, item);