codekingpro/portable-devtools
115k
1#ifndef Py_CPYTHON_LISTOBJECT_H2# error "this header file must not be included directly"3#endif4 5typedef struct {6 PyObject_VAR_HEAD7 /* Vector of pointers to list elements. list[0] is ob_item[0], etc. */8 PyObject **ob_item;9 10 /* ob_item contains space for 'allocated' elements. The number11 * currently in use is ob_size.12 * Invariants:13 * 0 <= ob_size <= allocated14 * len(list) == ob_size15 * ob_item == NULL implies ob_size == allocated == 016 * list.sort() temporarily sets allocated to -1 to detect mutations.17 *18 * Items must normally not be NULL, except during construction when19 * the list is not yet visible outside the function that builds it.20 */21 Py_ssize_t allocated;22} PyListObject;23 24/* Cast argument to PyListObject* type. */25#define _PyList_CAST(op) \26 (assert(PyList_Check(op)), _Py_CAST(PyListObject*, (op)))27 28// Macros and static inline functions, trading safety for speed29 30static inline Py_ssize_t PyList_GET_SIZE(PyObject *op) {31 PyListObject *list = _PyList_CAST(op);32#ifdef Py_GIL_DISABLED33 return _Py_atomic_load_ssize_relaxed(&(_PyVarObject_CAST(list)->ob_size));34#else35 return Py_SIZE(list);36#endif37}38#define PyList_GET_SIZE(op) PyList_GET_SIZE(_PyObject_CAST(op))39 40#define PyList_GET_ITEM(op, index) (_PyList_CAST(op)->ob_item[(index)])41 42static inline void43PyList_SET_ITEM(PyObject *op, Py_ssize_t index, PyObject *value) {44 PyListObject *list = _PyList_CAST(op);45 assert(0 <= index);46 assert(index < list->allocated);47 list->ob_item[index] = value;48}49#define PyList_SET_ITEM(op, index, value) \50 PyList_SET_ITEM(_PyObject_CAST(op), (index), _PyObject_CAST(value))51 52PyAPI_FUNC(int) PyList_Extend(PyObject *self, PyObject *iterable);53PyAPI_FUNC(int) PyList_Clear(PyObject *self);54 