#include "pycore_floatobject.h" // _PY_FLOAT_BIG_ENDIAN
#include "pycore_modsupport.h" // _PyArg_NoKeywords()
#include "pycore_moduleobject.h" // _PyModule_GetState()
+#include "pycore_object.h" // _PyObject_GC_TRACK()
#include "pycore_tuple.h" // _PyTuple_FromPairSteal
#include "pycore_weakref.h" // FT_CLEAR_WEAKREFS()
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=a5c29edf59f176a3]*/
static PyObject *
-newarrayobject(PyTypeObject *type, Py_ssize_t size, const struct arraydescr *descr)
+newarrayobject_untracked(PyTypeObject *type, Py_ssize_t size,
+ const struct arraydescr *descr)
{
arrayobject *op;
size_t nbytes;
return PyErr_NoMemory();
}
nbytes = size * descr->itemsize;
- op = (arrayobject *) type->tp_alloc(type, 0);
+ op = (arrayobject *) _PyType_AllocNoTrack(type, 0);
if (op == NULL) {
return NULL;
}
return (PyObject *) op;
}
+static PyObject *
+newarrayobject(PyTypeObject *type, Py_ssize_t size, const struct arraydescr *descr)
+{
+ PyObject *op = newarrayobject_untracked(type, size, descr);
+ if (op != NULL) {
+ _PyObject_GC_TRACK(op);
+ }
+ return op;
+}
+
static PyObject *
getarrayitem(PyObject *op, Py_ssize_t i)
{
ihigh = ilow;
else if (ihigh > Py_SIZE(a))
ihigh = Py_SIZE(a);
- np = (arrayobject *) newarrayobject(state->ArrayType, ihigh - ilow, a->ob_descr);
+ np = (arrayobject *) newarrayobject_untracked(state->ArrayType, ihigh - ilow, a->ob_descr);
if (np == NULL)
return NULL;
if (ihigh > ilow) {
memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
(ihigh-ilow) * a->ob_descr->itemsize);
}
+ _PyObject_GC_TRACK(np);
return (PyObject *)np;
}
return PyErr_NoMemory();
}
size = Py_SIZE(a) + Py_SIZE(b);
- np = (arrayobject *) newarrayobject(state->ArrayType, size, a->ob_descr);
+ np = (arrayobject *) newarrayobject_untracked(state->ArrayType, size, a->ob_descr);
if (np == NULL) {
return NULL;
}
memcpy(np->ob_item + Py_SIZE(a)*a->ob_descr->itemsize,
b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
}
+ _PyObject_GC_TRACK(np);
return (PyObject *)np;
#undef b
}
return PyErr_NoMemory();
}
Py_ssize_t size = array_length * n;
- arrayobject* np = (arrayobject *) newarrayobject(state->ArrayType, size, a->ob_descr);
+ arrayobject* np = (arrayobject *) newarrayobject_untracked(state->ArrayType, size, a->ob_descr);
if (np == NULL)
return NULL;
- if (size == 0)
+ if (size == 0) {
+ _PyObject_GC_TRACK(np);
return (PyObject *)np;
+ }
const Py_ssize_t oldbytes = array_length * a->ob_descr->itemsize;
const Py_ssize_t newbytes = oldbytes * n;
_PyBytes_Repeat(np->ob_item, newbytes, a->ob_item, oldbytes);
+ _PyObject_GC_TRACK(np);
return (PyObject *)np;
}
return newarrayobject(state->ArrayType, 0, self->ob_descr);
}
else if (step == 1) {
- PyObject *result = newarrayobject(state->ArrayType,
- slicelength, self->ob_descr);
+ PyObject *result = newarrayobject_untracked(state->ArrayType, slicelength, self->ob_descr);
if (result == NULL)
return NULL;
memcpy(((arrayobject *)result)->ob_item,
self->ob_item + start * itemsize,
slicelength * itemsize);
+ _PyObject_GC_TRACK(result);
return result;
}
else {
- result = newarrayobject(state->ArrayType, slicelength, self->ob_descr);
+ result = newarrayobject_untracked(state->ArrayType, slicelength, self->ob_descr);
if (!result) return NULL;
ar = (arrayobject*)result;
itemsize);
}
+ _PyObject_GC_TRACK(result);
return result;
}
}
else
len = 0;
- a = newarrayobject(type, len, descr);
+ a = newarrayobject_untracked(type, len, descr);
if (a == NULL) {
Py_XDECREF(it);
return NULL;
}
Py_DECREF(it);
}
+ // Track only once fully built.
+ _PyObject_GC_TRACK(a);
return a;
}
}
{Py_tp_methods, array_methods},
{Py_tp_members, array_members},
{Py_tp_getset, array_getsets},
- {Py_tp_alloc, PyType_GenericAlloc},
+ {Py_tp_alloc, _PyType_AllocNoTrack},
{Py_tp_new, array_new},
{Py_tp_traverse, _PyObject_VisitType},