summaryrefslogtreecommitdiff
path: root/Objects/structseq.c
diff options
context:
space:
mode:
Diffstat (limited to 'Objects/structseq.c')
-rw-r--r--Objects/structseq.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/Objects/structseq.c b/Objects/structseq.c
index a2eefb0455..f8bf9477f2 100644
--- a/Objects/structseq.c
+++ b/Objects/structseq.c
@@ -532,6 +532,36 @@ PyStructSequence_InitType(PyTypeObject *type, PyStructSequence_Desc *desc)
(void)PyStructSequence_InitType2(type, desc);
}
+
+void
+_PyStructSequence_FiniType(PyTypeObject *type)
+{
+ // Ensure that the type is initialized
+ assert(type->tp_name != NULL);
+ assert(type->tp_base == &PyTuple_Type);
+
+ // Cannot delete a type if it still has subclasses
+ if (type->tp_subclasses != NULL) {
+ return;
+ }
+
+ // Undo PyStructSequence_NewType()
+ type->tp_name = NULL;
+ PyMem_Free(type->tp_members);
+
+ _PyStaticType_Dealloc(type);
+ assert(Py_REFCNT(type) == 1);
+ // Undo Py_INCREF(type) of _PyStructSequence_InitType().
+ // Don't use Py_DECREF(): static type must not be deallocated
+ Py_SET_REFCNT(type, 0);
+
+ // Make sure that _PyStructSequence_InitType() will initialize
+ // the type again
+ assert(Py_REFCNT(type) == 0);
+ assert(type->tp_name == NULL);
+}
+
+
PyTypeObject *
PyStructSequence_NewType(PyStructSequence_Desc *desc)
{