@@ -119,7 +119,7 @@ PySlice_New(PyObject *start, PyObject *stop, PyObject *step)
119119 slice_cache = NULL ;
120120 _Py_NewReference ((PyObject * )obj );
121121 } else {
122- obj = PyObject_New (PySliceObject , & PySlice_Type );
122+ obj = PyObject_GC_New (PySliceObject , & PySlice_Type );
123123 if (obj == NULL )
124124 return NULL ;
125125 }
@@ -135,6 +135,7 @@ PySlice_New(PyObject *start, PyObject *stop, PyObject *step)
135135 obj -> start = start ;
136136 obj -> stop = stop ;
137137
138+ _PyObject_GC_TRACK (obj );
138139 return (PyObject * ) obj ;
139140}
140141
@@ -288,13 +289,14 @@ Create a slice object. This is used for extended slicing (e.g. a[0:10:2]).");
288289static void
289290slice_dealloc (PySliceObject * r )
290291{
292+ _PyObject_GC_UNTRACK (r );
291293 Py_DECREF (r -> step );
292294 Py_DECREF (r -> start );
293295 Py_DECREF (r -> stop );
294296 if (slice_cache == NULL )
295297 slice_cache = r ;
296298 else
297- PyObject_Del (r );
299+ PyObject_GC_Del (r );
298300}
299301
300302static PyObject *
@@ -586,6 +588,15 @@ slice_richcompare(PyObject *v, PyObject *w, int op)
586588 return res ;
587589}
588590
591+ static int
592+ slice_traverse (PySliceObject * v , visitproc visit , void * arg )
593+ {
594+ Py_VISIT (v -> start );
595+ Py_VISIT (v -> stop );
596+ Py_VISIT (v -> step );
597+ return 0 ;
598+ }
599+
589600PyTypeObject PySlice_Type = {
590601 PyVarObject_HEAD_INIT (& PyType_Type , 0 )
591602 "slice" , /* Name of this type */
@@ -606,9 +617,9 @@ PyTypeObject PySlice_Type = {
606617 PyObject_GenericGetAttr , /* tp_getattro */
607618 0 , /* tp_setattro */
608619 0 , /* tp_as_buffer */
609- Py_TPFLAGS_DEFAULT , /* tp_flags */
620+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC , /* tp_flags */
610621 slice_doc , /* tp_doc */
611- 0 , /* tp_traverse */
622+ ( traverseproc ) slice_traverse , /* tp_traverse */
612623 0 , /* tp_clear */
613624 slice_richcompare , /* tp_richcompare */
614625 0 , /* tp_weaklistoffset */
0 commit comments