| #ifndef Py_INTERNAL_LIST_H |
| #define Py_INTERNAL_LIST_H |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| #ifndef Py_BUILD_CORE |
| # error "this header requires Py_BUILD_CORE define" |
| #endif |
| |
| #include "listobject.h" // _PyList_CAST() |
| |
| |
| /* runtime lifecycle */ |
| |
| extern void _PyList_Fini(PyInterpreterState *); |
| |
| |
| /* other API */ |
| |
| #ifndef WITH_FREELISTS |
| // without freelists |
| # define PyList_MAXFREELIST 0 |
| #endif |
| |
| /* Empty list reuse scheme to save calls to malloc and free */ |
| #ifndef PyList_MAXFREELIST |
| # define PyList_MAXFREELIST 80 |
| #endif |
| |
| struct _Py_list_state { |
| #if PyList_MAXFREELIST > 0 |
| PyListObject *free_list[PyList_MAXFREELIST]; |
| int numfree; |
| #endif |
| }; |
| |
| #define _PyList_ITEMS(op) (_PyList_CAST(op)->ob_item) |
| |
| extern int |
| _PyList_AppendTakeRefListResize(PyListObject *self, PyObject *newitem); |
| |
| static inline int |
| _PyList_AppendTakeRef(PyListObject *self, PyObject *newitem) |
| { |
| assert(self != NULL && newitem != NULL); |
| assert(PyList_Check(self)); |
| Py_ssize_t len = PyList_GET_SIZE(self); |
| Py_ssize_t allocated = self->allocated; |
| assert((size_t)len + 1 < PY_SSIZE_T_MAX); |
| if (allocated > len) { |
| PyList_SET_ITEM(self, len, newitem); |
| Py_SET_SIZE(self, len + 1); |
| return 0; |
| } |
| return _PyList_AppendTakeRefListResize(self, newitem); |
| } |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| #endif /* !Py_INTERNAL_LIST_H */ |