extern int
_PyList_AppendTakeRefListResize(PyListObject *self, PyObject *newitem);
+// In free-threaded build: self should be locked by the caller, if it should be thread-safe.
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 len = Py_SIZE(self);
Py_ssize_t allocated = self->allocated;
assert((size_t)len + 1 < PY_SSIZE_T_MAX);
if (allocated > len) {
static inline void Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size) {
assert(ob->ob_base.ob_type != &PyLong_Type);
assert(ob->ob_base.ob_type != &PyBool_Type);
+#ifdef Py_GIL_DISABLED
+ _Py_atomic_store_ssize_relaxed(&ob->ob_size, size);
+#else
ob->ob_size = size;
+#endif
}
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000
# define Py_SET_SIZE(ob, size) Py_SET_SIZE(_PyVarObject_CAST(ob), (size))
}
#endif
-
/* Ensure ob_item has room for at least newsize elements, and set
* ob_size to newsize. If newsize > ob_size on entry, the content
* of the new slots at exit is undefined heap trash; it's the caller's
PyErr_BadInternalCall();
return -1;
}
- else
- return Py_SIZE(op);
+ else {
+ return PyList_GET_SIZE(op);
+ }
}
static inline int
int
_PyList_AppendTakeRefListResize(PyListObject *self, PyObject *newitem)
{
- Py_ssize_t len = PyList_GET_SIZE(self);
+ Py_ssize_t len = Py_SIZE(self);
assert(self->allocated == -1 || self->allocated == len);
if (list_resize(self, len + 1) < 0) {
Py_DECREF(newitem);
PyList_Append(PyObject *op, PyObject *newitem)
{
if (PyList_Check(op) && (newitem != NULL)) {
- return _PyList_AppendTakeRef((PyListObject *)op, Py_NewRef(newitem));
+ int ret;
+ Py_BEGIN_CRITICAL_SECTION(op);
+ ret = _PyList_AppendTakeRef((PyListObject *)op, Py_NewRef(newitem));
+ Py_END_CRITICAL_SECTION();
+ return ret;
}
PyErr_BadInternalCall();
return -1;
list_item(PyObject *aa, Py_ssize_t i)
{
PyListObject *a = (PyListObject *)aa;
- if (!valid_index(i, Py_SIZE(a))) {
+ if (!valid_index(i, PyList_GET_SIZE(a))) {
PyErr_SetObject(PyExc_IndexError, &_Py_STR(list_err));
return NULL;
}
PyErr_BadInternalCall();
return NULL;
}
+ PyObject *ret;
+ Py_BEGIN_CRITICAL_SECTION(a);
if (ilow < 0) {
ilow = 0;
}
else if (ihigh > Py_SIZE(a)) {
ihigh = Py_SIZE(a);
}
- return list_slice((PyListObject *)a, ilow, ihigh);
+ ret = list_slice((PyListObject *)a, ilow, ihigh);
+ Py_END_CRITICAL_SECTION();
+ return ret;
}
static PyObject *