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