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;
22#if PYTHON_VERSION < 0x3d0
23 PyTupleObject **items = tstate->interp->tuple.free_list;
24 int *numfree = tstate->interp->tuple.numfree;
26 struct _Py_object_freelists *freelists = _Nuitka_object_freelists_GET(tstate);
27 struct _Py_tuple_freelist *state = &freelists->tuples;
28 PyTupleObject **items = state->items;
29 int *numfree = state->numfree;
32#if PYTHON_VERSION < 0x3b0
33 Py_ssize_t index = size;
35 Py_ssize_t index = size - 1;
38 if ((size < PyTuple_MAXSAVESIZE) && (result_tuple = items[index]) != NULL) {
39 items[index] = (PyTupleObject *)result_tuple->ob_item[0];
42 assert(Py_SIZE(result_tuple) == size);
43 assert(Py_TYPE(result_tuple) == &PyTuple_Type);
45 Nuitka_Py_NewReference((PyObject *)result_tuple);
49 ((
size_t)PY_SSIZE_T_MAX - (
sizeof(PyTupleObject) -
sizeof(PyObject *))) /
sizeof(PyObject *)) {
50 return PyErr_NoMemory();
53 result_tuple = (PyTupleObject *)Nuitka_GC_NewVar(&PyTuple_Type, size);
61 for (Py_ssize_t i = 0; i < size; i++) {
62 result_tuple->ob_item[i] = NULL;
65 Nuitka_GC_Track(result_tuple);
67 assert(PyTuple_CheckExact(result_tuple));
68 assert(PyTuple_GET_SIZE(result_tuple) == size);
70 return (PyObject *)result_tuple;
73PyObject *MAKE_TUPLE_EMPTY_VAR(PyThreadState *tstate, Py_ssize_t size) {
75 PyObject *result = const_tuple_empty;
79 return MAKE_TUPLE_EMPTY(tstate, size);
85PyObject *TUPLE_CONCAT(PyThreadState *tstate, PyObject *tuple1, PyObject *tuple2) {
86 Py_ssize_t size = Py_SIZE(tuple1) + Py_SIZE(tuple2);
89 PyTupleObject *result = (PyTupleObject *)MAKE_TUPLE_EMPTY_VAR(tstate, size);
90 if (unlikely(result == NULL)) {
94 PyObject **src = ((PyTupleObject *)tuple1)->ob_item;
95 PyObject **dest = result->ob_item;
97 for (Py_ssize_t i = 0; i < Py_SIZE(tuple1); i++) {
103 src = ((PyTupleObject *)tuple2)->ob_item;
104 dest = result->ob_item + Py_SIZE(tuple1);
106 for (Py_ssize_t i = 0; i < Py_SIZE(tuple2); i++) {
107 PyObject *v = src[i];
112 return (PyObject *)result;
115PyObject *TUPLE_COPY(PyThreadState *tstate, PyObject *tuple) {
117 assert(PyTuple_CheckExact(tuple));
119 Py_ssize_t size = PyTuple_GET_SIZE(tuple);
120 PyObject *result = MAKE_TUPLE_EMPTY_VAR(tstate, size);
122 if (unlikely(result == NULL)) {
126 for (Py_ssize_t i = 0; i < size; i++) {
127 PyObject *item = PyTuple_GET_ITEM(tuple, i);
129 PyList_SET_ITEM(result, i, item);