1414#include "pycore_floatobject.h" // _PY_FLOAT_BIG_ENDIAN
1515#include "pycore_modsupport.h" // _PyArg_NoKeywords()
1616#include "pycore_moduleobject.h" // _PyModule_GetState()
17+ #include "pycore_object.h" // _PyObject_GC_TRACK()
1718#include "pycore_tuple.h" // _PyTuple_FromPairSteal
1819#include "pycore_weakref.h" // FT_CLEAR_WEAKREFS()
1920
@@ -752,7 +753,8 @@ class array.array "arrayobject *" "ArrayType"
752753/*[clinic end generated code: output=da39a3ee5e6b4b0d input=a5c29edf59f176a3]*/
753754
754755static PyObject *
755- newarrayobject (PyTypeObject * type , Py_ssize_t size , const struct arraydescr * descr )
756+ newarrayobject_untracked (PyTypeObject * type , Py_ssize_t size ,
757+ const struct arraydescr * descr )
756758{
757759 arrayobject * op ;
758760 size_t nbytes ;
@@ -767,7 +769,7 @@ newarrayobject(PyTypeObject *type, Py_ssize_t size, const struct arraydescr *des
767769 return PyErr_NoMemory ();
768770 }
769771 nbytes = size * descr -> itemsize ;
770- op = (arrayobject * ) type -> tp_alloc (type , 0 );
772+ op = (arrayobject * ) _PyType_AllocNoTrack (type , 0 );
771773 if (op == NULL ) {
772774 return NULL ;
773775 }
@@ -789,6 +791,16 @@ newarrayobject(PyTypeObject *type, Py_ssize_t size, const struct arraydescr *des
789791 return (PyObject * ) op ;
790792}
791793
794+ static PyObject *
795+ newarrayobject (PyTypeObject * type , Py_ssize_t size , const struct arraydescr * descr )
796+ {
797+ PyObject * op = newarrayobject_untracked (type , size , descr );
798+ if (op != NULL ) {
799+ _PyObject_GC_TRACK (op );
800+ }
801+ return op ;
802+ }
803+
792804static PyObject *
793805getarrayitem (PyObject * op , Py_ssize_t i )
794806{
@@ -2973,7 +2985,7 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
29732985 else
29742986 len = 0 ;
29752987
2976- a = newarrayobject (type , len , descr );
2988+ a = newarrayobject_untracked (type , len , descr );
29772989 if (a == NULL ) {
29782990 Py_XDECREF (it );
29792991 return NULL ;
@@ -3039,6 +3051,8 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
30393051 }
30403052 Py_DECREF (it );
30413053 }
3054+ // Track only once fully built.
3055+ _PyObject_GC_TRACK (a );
30423056 return a ;
30433057 }
30443058 }
0 commit comments