static HASHobject *
new_hash_object(PyTypeObject *type)
{
- HASHobject *retval = PyObject_New(HASHobject, type);
+ assert(type != NULL);
+ assert(type->tp_alloc != NULL);
+ HASHobject *retval = (HASHobject *)type->tp_alloc(type, 0);
if (retval == NULL) {
return NULL;
}
static void
_hashlib_HASH_dealloc(PyObject *op)
{
+ PyTypeObject *tp = Py_TYPE(op);
+ PyObject_GC_UnTrack(op);
HASHobject *self = HASHobject_CAST(op);
- PyTypeObject *tp = Py_TYPE(self);
EVP_MD_CTX_free(self->ctx);
- PyObject_Free(self);
+ tp->tp_free(self);
Py_DECREF(tp);
}
+static int
+_hashlib_HASH_traverse(PyObject *op, visitproc visit, void *arg)
+{
+ Py_VISIT(Py_TYPE(op));
+ return 0;
+}
+
static int
_hashlib_HASH_copy_locked(HASHobject *self, EVP_MD_CTX *new_ctx_p)
{
static PyType_Slot HASHobject_type_slots[] = {
{Py_tp_dealloc, _hashlib_HASH_dealloc},
+ {Py_tp_traverse, _hashlib_HASH_traverse},
{Py_tp_repr, _hashlib_HASH_repr},
{Py_tp_doc, (char *)HASHobject_type_doc},
{Py_tp_methods, HASH_methods},
| Py_TPFLAGS_BASETYPE
| Py_TPFLAGS_DISALLOW_INSTANTIATION
| Py_TPFLAGS_IMMUTABLETYPE
+ | Py_TPFLAGS_HAVE_GC
),
.slots = HASHobject_type_slots
};
"digest_size -- number of bytes in this hashes output");
static PyType_Slot HASHXOFobject_type_slots[] = {
+ {Py_tp_dealloc, _hashlib_HASH_dealloc},
+ {Py_tp_traverse, _hashlib_HASH_traverse},
{Py_tp_doc, (char *)HASHXOFobject_type_doc},
{Py_tp_methods, HASHXOFobject_methods},
{Py_tp_getset, HASHXOFobject_getsets},
| Py_TPFLAGS_BASETYPE
| Py_TPFLAGS_DISALLOW_INSTANTIATION
| Py_TPFLAGS_IMMUTABLETYPE
+ | Py_TPFLAGS_HAVE_GC
),
.slots = HASHXOFobject_type_slots
};
goto error;
}
- self = PyObject_New(HMACobject, state->HMAC_type);
+ assert(state->HMAC_type != NULL);
+ self = (HMACobject *)state->HMAC_type->tp_alloc(state->HMAC_type, 0);
if (self == NULL) {
goto error;
}
return NULL;
}
- retval = PyObject_New(HMACobject, Py_TYPE(self));
+ PyTypeObject *type = Py_TYPE(self);
+ retval = (HMACobject *)type->tp_alloc(type, 0);
if (retval == NULL) {
HMAC_CTX_free(ctx);
return NULL;
static void
_hmac_dealloc(PyObject *op)
{
+ PyTypeObject *tp = Py_TYPE(op);
+ PyObject_GC_UnTrack(op);
HMACobject *self = HMACobject_CAST(op);
- PyTypeObject *tp = Py_TYPE(self);
if (self->ctx != NULL) {
HMAC_CTX_free(self->ctx);
self->ctx = NULL;
}
- PyObject_Free(self);
+ tp->tp_free(self);
Py_DECREF(tp);
}
+static int
+_hashlib_HMAC_traverse(PyObject *op, visitproc visit, void *arg)
+{
+ Py_VISIT(Py_TYPE(op));
+ return 0;
+}
+
static PyObject *
_hmac_repr(PyObject *op)
{
{Py_tp_doc, (char *)hmactype_doc},
{Py_tp_repr, _hmac_repr},
{Py_tp_dealloc, _hmac_dealloc},
+ {Py_tp_traverse, _hashlib_HMAC_traverse},
{Py_tp_methods, HMAC_methods},
{Py_tp_getset, HMAC_getset},
{0, NULL}
};
PyType_Spec HMACtype_spec = {
- "_hashlib.HMAC", /* name */
- sizeof(HMACobject), /* basicsize */
- .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
+ .name = "_hashlib.HMAC",
+ .basicsize = sizeof(HMACobject),
+ .flags = (
+ Py_TPFLAGS_DEFAULT
+ | Py_TPFLAGS_DISALLOW_INSTANTIATION
+ | Py_TPFLAGS_IMMUTABLETYPE
+ | Py_TPFLAGS_HAVE_GC
+ ),
.slots = HMACtype_slots,
};