diff --git a/Modules/_lzmamodule.c b/Modules/_lzmamodule.c index 97f3a8f03da9a8..623cebd3fac97d 100644 --- a/Modules/_lzmamodule.c +++ b/Modules/_lzmamodule.c @@ -126,6 +126,9 @@ typedef struct { PyThread_type_lock lock; } Decompressor; +#define Compressor_CAST(op) ((Compressor *)(op)) +#define Decompressor_CAST(op) ((Decompressor *)(op)) + /* Helper functions. */ static int @@ -857,14 +860,16 @@ Compressor_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) } static void -Compressor_dealloc(Compressor *self) +Compressor_dealloc(PyObject *op) { + PyTypeObject *tp = Py_TYPE(op); + PyObject_GC_UnTrack(op); + Compressor *self = Compressor_CAST(op); lzma_end(&self->lzs); if (self->lock != NULL) { PyThread_free_lock(self->lock); } - PyTypeObject *tp = Py_TYPE(self); - tp->tp_free((PyObject *)self); + tp->tp_free(self); Py_DECREF(tp); } @@ -875,7 +880,7 @@ static PyMethodDef Compressor_methods[] = { }; static int -Compressor_traverse(Compressor *self, visitproc visit, void *arg) +Compressor_traverse(PyObject *self, visitproc visit, void *arg) { Py_VISIT(Py_TYPE(self)); return 0; @@ -925,7 +930,7 @@ static PyType_Spec lzma_compressor_type_spec = { // lzma_compressor_type_spec does not have Py_TPFLAGS_BASETYPE flag // which prevents to create a subclass. // So calling PyType_GetModuleState() in this file is always safe. - .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE), + .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_HAVE_GC), .slots = lzma_compressor_type_slots, }; @@ -1304,8 +1309,11 @@ _lzma_LZMADecompressor_impl(PyTypeObject *type, int format, } static void -Decompressor_dealloc(Decompressor *self) +Decompressor_dealloc(PyObject *op) { + PyTypeObject *tp = Py_TYPE(op); + PyObject_GC_UnTrack(op); + Decompressor *self = Decompressor_CAST(op); if(self->input_buffer != NULL) PyMem_Free(self->input_buffer); @@ -1314,13 +1322,12 @@ Decompressor_dealloc(Decompressor *self) if (self->lock != NULL) { PyThread_free_lock(self->lock); } - PyTypeObject *tp = Py_TYPE(self); - tp->tp_free((PyObject *)self); + tp->tp_free(self); Py_DECREF(tp); } static int -Decompressor_traverse(Decompressor *self, visitproc visit, void *arg) +Decompressor_traverse(PyObject *self, visitproc visit, void *arg) { Py_VISIT(Py_TYPE(self)); return 0; @@ -1372,7 +1379,7 @@ static PyType_Spec lzma_decompressor_type_spec = { // lzma_decompressor_type_spec does not have Py_TPFLAGS_BASETYPE flag // which prevents to create a subclass. // So calling PyType_GetModuleState() in this file is always safe. - .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE), + .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_HAVE_GC), .slots = lzma_decompressor_type_slots, };