mirror of
https://github.com/python/cpython.git
synced 2026-05-27 22:56:48 -04:00
24ddaee5ca
gh-106168: Update the size only after setting the item, to avoid temporary inconsistencies. Also remove the "what's new" sentence regarding the size setting since tuples cannot grow after allocation.
86 lines
2.0 KiB
C
86 lines
2.0 KiB
C
#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
|
|
|
|
|
|
extern PyObject* _PyList_Extend(PyListObject *, PyObject *);
|
|
extern void _PyList_DebugMallocStats(FILE *out);
|
|
|
|
|
|
/* 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) _Py_RVALUE(_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);
|
|
}
|
|
|
|
// Repeat the bytes of a buffer in place
|
|
static inline void
|
|
_Py_memory_repeat(char* dest, Py_ssize_t len_dest, Py_ssize_t len_src)
|
|
{
|
|
assert(len_src > 0);
|
|
Py_ssize_t copied = len_src;
|
|
while (copied < len_dest) {
|
|
Py_ssize_t bytes_to_copy = Py_MIN(copied, len_dest - copied);
|
|
memcpy(dest + copied, dest, bytes_to_copy);
|
|
copied += bytes_to_copy;
|
|
}
|
|
}
|
|
|
|
typedef struct {
|
|
PyObject_HEAD
|
|
Py_ssize_t it_index;
|
|
PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
|
|
} _PyListIterObject;
|
|
|
|
extern PyObject *_PyList_FromArraySteal(PyObject *const *src, Py_ssize_t n);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif /* !Py_INTERNAL_LIST_H */
|