Skip to content
Merged
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 58 additions & 19 deletions Modules/zlibmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,8 @@ static compobject *
newcompobject(PyTypeObject *type)
{
compobject *self;
self = PyObject_New(compobject, type);
assert(type != NULL && type->tp_alloc != NULL);
self = _compobject_CAST(type->tp_alloc(type, 0));
if (self == NULL)
return NULL;
self->eof = 0;
Expand Down Expand Up @@ -716,33 +717,41 @@ zlib_decompressobj_impl(PyObject *module, int wbits, PyObject *zdict)
}

static void
Dealloc(compobject *self)
compobject_dealloc_impl(PyObject *op, int (*dealloc)(z_streamp))
{
PyTypeObject *type = Py_TYPE(self);
PyTypeObject *type = Py_TYPE(op);
PyObject_GC_UnTrack(op);
compobject *self = _compobject_CAST(op);
if (self->is_initialised) {
(void)dealloc(&self->zst);
}
PyThread_free_lock(self->lock);
Py_XDECREF(self->unused_data);
Py_XDECREF(self->unconsumed_tail);
Py_XDECREF(self->zdict);
PyObject_Free(self);
type->tp_free(self);
Py_DECREF(type);
}

static int
compobject_traverse(PyObject *op, visitproc visit, void *arg)
{
compobject *self = _compobject_CAST(op);
Py_VISIT(Py_TYPE(op));
Py_VISIT(self->zdict);
return 0;
}

static void
Comp_dealloc(PyObject *op)
{
compobject *self = _compobject_CAST(op);
if (self->is_initialised)
(void)deflateEnd(&self->zst);
Dealloc(self);
compobject_dealloc_impl(op, &deflateEnd);
}

static void
Decomp_dealloc(PyObject *op)
{
compobject *self = _compobject_CAST(op);
if (self->is_initialised)
(void)inflateEnd(&self->zst);
Dealloc(self);
compobject_dealloc_impl(op, &inflateEnd);
}

/*[clinic input]
Expand Down Expand Up @@ -1115,6 +1124,7 @@ zlib_Compress_copy_impl(compobject *self, PyTypeObject *cls)
return_value->is_initialised = 1;

LEAVE_ZLIB(self);
assert(PyObject_GC_IsTracked((PyObject *)return_value));
return (PyObject *)return_value;

error:
Expand Down Expand Up @@ -1200,6 +1210,7 @@ zlib_Decompress_copy_impl(compobject *self, PyTypeObject *cls)
return_value->is_initialised = 1;

LEAVE_ZLIB(self);
assert(PyObject_GC_IsTracked((PyObject *)return_value));
return (PyObject *)return_value;

error:
Expand Down Expand Up @@ -1368,6 +1379,8 @@ typedef struct {
char needs_input;
} ZlibDecompressor;

#define ZlibDecompressor_CAST(op) ((ZlibDecompressor *)(op))

/*[clinic input]
class zlib._ZlibDecompressor "ZlibDecompressor *" "&ZlibDecompressorType"
[clinic start generated code]*/
Expand All @@ -1376,19 +1389,29 @@ class zlib._ZlibDecompressor "ZlibDecompressor *" "&ZlibDecompressorType"
static void
ZlibDecompressor_dealloc(PyObject *op)
{
ZlibDecompressor *self = (ZlibDecompressor*)op;
PyObject *type = (PyObject *)Py_TYPE(self);
PyTypeObject *type = Py_TYPE(op);
PyObject_GC_UnTrack(op);
ZlibDecompressor *self = ZlibDecompressor_CAST(op);
PyThread_free_lock(self->lock);
if (self->is_initialised) {
inflateEnd(&self->zst);
}
PyMem_Free(self->input_buffer);
Py_CLEAR(self->unused_data);
Py_CLEAR(self->zdict);
PyObject_Free(self);
type->tp_free(self);
Py_DECREF(type);
}

static int
ZlibDecompressor_traverse(PyObject *op, visitproc visit, void *arg)
{
ZlibDecompressor *self = ZlibDecompressor_CAST(op);
Py_VISIT(Py_TYPE(op));
Py_VISIT(self->zdict);
return 0;
}

static int
set_inflate_zdict_ZlibDecompressor(zlibstate *state, ZlibDecompressor *self)
{
Expand Down Expand Up @@ -1731,8 +1754,9 @@ static PyObject *
zlib__ZlibDecompressor_impl(PyTypeObject *type, int wbits, PyObject *zdict)
/*[clinic end generated code: output=1065607df0d33baa input=9ebad0be6de226e2]*/
{
assert(type != NULL && type->tp_alloc != NULL);
zlibstate *state = PyType_GetModuleState(type);
ZlibDecompressor *self = PyObject_New(ZlibDecompressor, type);
ZlibDecompressor *self = ZlibDecompressor_CAST(type->tp_alloc(type, 0));
if (self == NULL) {
return NULL;
}
Expand Down Expand Up @@ -2015,19 +2039,25 @@ static PyMethodDef zlib_methods[] =

static PyType_Slot Comptype_slots[] = {
{Py_tp_dealloc, Comp_dealloc},
{Py_tp_traverse, compobject_traverse},
{Py_tp_methods, comp_methods},
{0, 0},
};

static PyType_Spec Comptype_spec = {
.name = "zlib.Compress",
.basicsize = sizeof(compobject),
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
.flags = (
Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_DISALLOW_INSTANTIATION
| Py_TPFLAGS_HAVE_GC
),
.slots= Comptype_slots,
};

static PyType_Slot Decomptype_slots[] = {
{Py_tp_dealloc, Decomp_dealloc},
{Py_tp_traverse, compobject_traverse},
{Py_tp_methods, Decomp_methods},
{Py_tp_members, Decomp_members},
{0, 0},
Expand All @@ -2036,12 +2066,17 @@ static PyType_Slot Decomptype_slots[] = {
static PyType_Spec Decomptype_spec = {
.name = "zlib.Decompress",
.basicsize = sizeof(compobject),
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
.flags = (
Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_DISALLOW_INSTANTIATION
| Py_TPFLAGS_HAVE_GC
),
.slots = Decomptype_slots,
};

static PyType_Slot ZlibDecompressor_type_slots[] = {
{Py_tp_dealloc, ZlibDecompressor_dealloc},
{Py_tp_traverse, ZlibDecompressor_traverse},
{Py_tp_members, ZlibDecompressor_members},
{Py_tp_new, zlib__ZlibDecompressor},
{Py_tp_doc, (char *)zlib__ZlibDecompressor__doc__},
Expand All @@ -2056,7 +2091,11 @@ static PyType_Spec ZlibDecompressor_type_spec = {
// ZlibDecompressor_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 = ZlibDecompressor_type_slots,
};

Expand Down
Loading