17db96d56Sopenharmony_ci#ifndef Py_INTERNAL_TUPLE_H
27db96d56Sopenharmony_ci#define Py_INTERNAL_TUPLE_H
37db96d56Sopenharmony_ci#ifdef __cplusplus
47db96d56Sopenharmony_ciextern "C" {
57db96d56Sopenharmony_ci#endif
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci#ifndef Py_BUILD_CORE
87db96d56Sopenharmony_ci#  error "this header requires Py_BUILD_CORE define"
97db96d56Sopenharmony_ci#endif
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci#include "tupleobject.h"   /* _PyTuple_CAST() */
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci/* runtime lifecycle */
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_ciextern PyStatus _PyTuple_InitGlobalObjects(PyInterpreterState *);
177db96d56Sopenharmony_ciextern PyStatus _PyTuple_InitTypes(PyInterpreterState *);
187db96d56Sopenharmony_ciextern void _PyTuple_Fini(PyInterpreterState *);
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ci/* other API */
227db96d56Sopenharmony_ci
237db96d56Sopenharmony_ci// PyTuple_MAXSAVESIZE - largest tuple to save on free list
247db96d56Sopenharmony_ci// PyTuple_MAXFREELIST - maximum number of tuples of each size to save
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ci#if defined(PyTuple_MAXSAVESIZE) && PyTuple_MAXSAVESIZE <= 0
277db96d56Sopenharmony_ci   // A build indicated that tuple freelists should not be used.
287db96d56Sopenharmony_ci#  define PyTuple_NFREELISTS 0
297db96d56Sopenharmony_ci#  undef PyTuple_MAXSAVESIZE
307db96d56Sopenharmony_ci#  undef PyTuple_MAXFREELIST
317db96d56Sopenharmony_ci
327db96d56Sopenharmony_ci#elif !defined(WITH_FREELISTS)
337db96d56Sopenharmony_ci#  define PyTuple_NFREELISTS 0
347db96d56Sopenharmony_ci#  undef PyTuple_MAXSAVESIZE
357db96d56Sopenharmony_ci#  undef PyTuple_MAXFREELIST
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ci#else
387db96d56Sopenharmony_ci   // We are using a freelist for tuples.
397db96d56Sopenharmony_ci#  ifndef PyTuple_MAXSAVESIZE
407db96d56Sopenharmony_ci#    define PyTuple_MAXSAVESIZE 20
417db96d56Sopenharmony_ci#  endif
427db96d56Sopenharmony_ci#  define PyTuple_NFREELISTS PyTuple_MAXSAVESIZE
437db96d56Sopenharmony_ci#  ifndef PyTuple_MAXFREELIST
447db96d56Sopenharmony_ci#    define PyTuple_MAXFREELIST 2000
457db96d56Sopenharmony_ci#  endif
467db96d56Sopenharmony_ci#endif
477db96d56Sopenharmony_ci
487db96d56Sopenharmony_cistruct _Py_tuple_state {
497db96d56Sopenharmony_ci#if PyTuple_NFREELISTS > 0
507db96d56Sopenharmony_ci    /* There is one freelist for each size from 1 to PyTuple_MAXSAVESIZE.
517db96d56Sopenharmony_ci       The empty tuple is handled separately.
527db96d56Sopenharmony_ci
537db96d56Sopenharmony_ci       Each tuple stored in the array is the head of the linked list
547db96d56Sopenharmony_ci       (and the next available tuple) for that size.  The actual tuple
557db96d56Sopenharmony_ci       object is used as the linked list node, with its first item
567db96d56Sopenharmony_ci       (ob_item[0]) pointing to the next node (i.e. the previous head).
577db96d56Sopenharmony_ci       Each linked list is initially NULL. */
587db96d56Sopenharmony_ci    PyTupleObject *free_list[PyTuple_NFREELISTS];
597db96d56Sopenharmony_ci    int numfree[PyTuple_NFREELISTS];
607db96d56Sopenharmony_ci#else
617db96d56Sopenharmony_ci    char _unused;  // Empty structs are not allowed.
627db96d56Sopenharmony_ci#endif
637db96d56Sopenharmony_ci};
647db96d56Sopenharmony_ci
657db96d56Sopenharmony_ci#define _PyTuple_ITEMS(op) (_PyTuple_CAST(op)->ob_item)
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_ciextern PyObject *_PyTuple_FromArray(PyObject *const *, Py_ssize_t);
687db96d56Sopenharmony_ciextern PyObject *_PyTuple_FromArraySteal(PyObject *const *, Py_ssize_t);
697db96d56Sopenharmony_ci
707db96d56Sopenharmony_ci#ifdef __cplusplus
717db96d56Sopenharmony_ci}
727db96d56Sopenharmony_ci#endif
737db96d56Sopenharmony_ci#endif   /* !Py_INTERNAL_TUPLE_H */
74