Skip to content
Merged
Changes from all 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
80 changes: 61 additions & 19 deletions Modules/zlibmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,8 @@ typedef struct
PyThread_type_lock lock;
} compobject;

#define _compobject_CAST(op) ((compobject *)op)

static void
zlib_error(zlibstate *state, z_stream zst, int err, const char *msg)
{
Expand Down Expand Up @@ -261,7 +263,9 @@ static compobject *
newcompobject(PyTypeObject *type)
{
compobject *self;
self = PyObject_New(compobject, type);
assert(type != NULL);
assert(type->tp_alloc != NULL);
self = _compobject_CAST(type->tp_alloc(type, 0));
if (self == NULL)
return NULL;
self->eof = 0;
Expand Down Expand Up @@ -704,31 +708,41 @@ zlib_decompressobj_impl(PyObject *module, int wbits, PyObject *zdict)
}

static void
Dealloc(compobject *self)
compobject_dealloc_impl(PyObject *op, int (*dealloc)(z_streamp))
{
PyObject *type = (PyObject *)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(compobject *self)
Comp_dealloc(PyObject *op)
{
if (self->is_initialised)
deflateEnd(&self->zst);
Dealloc(self);
compobject_dealloc_impl(op, &deflateEnd);
}

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

/*[clinic input]
Expand Down Expand Up @@ -1353,26 +1367,39 @@ typedef struct {
char needs_input;
} ZlibDecompressor;

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

/*[clinic input]
class zlib.ZlibDecompressor "ZlibDecompressor *" "&ZlibDecompressorType"
[clinic start generated code]*/
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=0658178ab94645df]*/

static void
ZlibDecompressor_dealloc(ZlibDecompressor *self)
ZlibDecompressor_dealloc(PyObject *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 @@ -1724,7 +1751,7 @@ ZlibDecompressor__new__(PyTypeObject *cls,
args, kwargs, format, keywords, &wbits, &zdict)) {
return NULL;
}
ZlibDecompressor *self = PyObject_New(ZlibDecompressor, cls);
ZlibDecompressor *self = ZlibDecompressor_CAST(cls->tp_alloc(cls, 0));
if (self == NULL) {
return NULL;
}
Expand Down Expand Up @@ -1932,19 +1959,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 @@ -1953,12 +1986,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, ZlibDecompressor__new__},
{Py_tp_doc, (char *)ZlibDecompressor__new____doc__},
Expand All @@ -1973,7 +2011,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,
};
PyDoc_STRVAR(zlib_module_documentation,
Expand Down
Loading