@@ -752,7 +752,9 @@ py_wrapper_EVP_MD_CTX_new(void)
752
752
static HASHobject *
753
753
new_hash_object (PyTypeObject * type )
754
754
{
755
- HASHobject * retval = PyObject_New (HASHobject , type );
755
+ assert (type != NULL );
756
+ assert (type -> tp_alloc != NULL );
757
+ HASHobject * retval = (HASHobject * )type -> tp_alloc (type , 0 );
756
758
if (retval == NULL ) {
757
759
return NULL ;
758
760
}
@@ -792,13 +794,21 @@ _hashlib_HASH_hash(HASHobject *self, const void *vp, Py_ssize_t len)
792
794
static void
793
795
_hashlib_HASH_dealloc (PyObject * op )
794
796
{
797
+ PyTypeObject * tp = Py_TYPE (op );
798
+ PyObject_GC_UnTrack (op );
795
799
HASHobject * self = HASHobject_CAST (op );
796
- PyTypeObject * tp = Py_TYPE (self );
797
800
EVP_MD_CTX_free (self -> ctx );
798
- PyObject_Free (self );
801
+ tp -> tp_free (self );
799
802
Py_DECREF (tp );
800
803
}
801
804
805
+ static int
806
+ _hashlib_HASH_traverse (PyObject * op , visitproc visit , void * arg )
807
+ {
808
+ Py_VISIT (Py_TYPE (op ));
809
+ return 0 ;
810
+ }
811
+
802
812
static int
803
813
_hashlib_HASH_copy_locked (HASHobject * self , EVP_MD_CTX * new_ctx_p )
804
814
{
@@ -993,6 +1003,7 @@ PyDoc_STRVAR(HASHobject_type_doc,
993
1003
994
1004
static PyType_Slot HASHobject_type_slots [] = {
995
1005
{Py_tp_dealloc , _hashlib_HASH_dealloc },
1006
+ {Py_tp_traverse , _hashlib_HASH_traverse },
996
1007
{Py_tp_repr , _hashlib_HASH_repr },
997
1008
{Py_tp_doc , (char * )HASHobject_type_doc },
998
1009
{Py_tp_methods , HASH_methods },
@@ -1008,6 +1019,7 @@ static PyType_Spec HASHobject_type_spec = {
1008
1019
| Py_TPFLAGS_BASETYPE
1009
1020
| Py_TPFLAGS_DISALLOW_INSTANTIATION
1010
1021
| Py_TPFLAGS_IMMUTABLETYPE
1022
+ | Py_TPFLAGS_HAVE_GC
1011
1023
),
1012
1024
.slots = HASHobject_type_slots
1013
1025
};
@@ -1165,6 +1177,8 @@ PyDoc_STRVAR(HASHXOFobject_type_doc,
1165
1177
"digest_size -- number of bytes in this hashes output" );
1166
1178
1167
1179
static PyType_Slot HASHXOFobject_type_slots [] = {
1180
+ {Py_tp_dealloc , _hashlib_HASH_dealloc },
1181
+ {Py_tp_traverse , _hashlib_HASH_traverse },
1168
1182
{Py_tp_doc , (char * )HASHXOFobject_type_doc },
1169
1183
{Py_tp_methods , HASHXOFobject_methods },
1170
1184
{Py_tp_getset , HASHXOFobject_getsets },
@@ -1179,6 +1193,7 @@ static PyType_Spec HASHXOFobject_type_spec = {
1179
1193
| Py_TPFLAGS_BASETYPE
1180
1194
| Py_TPFLAGS_DISALLOW_INSTANTIATION
1181
1195
| Py_TPFLAGS_IMMUTABLETYPE
1196
+ | Py_TPFLAGS_HAVE_GC
1182
1197
),
1183
1198
.slots = HASHXOFobject_type_slots
1184
1199
};
@@ -1902,7 +1917,8 @@ _hashlib_hmac_new_impl(PyObject *module, Py_buffer *key, PyObject *msg_obj,
1902
1917
goto error ;
1903
1918
}
1904
1919
1905
- self = PyObject_New (HMACobject , state -> HMAC_type );
1920
+ assert (state -> HMAC_type != NULL );
1921
+ self = (HMACobject * )state -> HMAC_type -> tp_alloc (state -> HMAC_type , 0 );
1906
1922
if (self == NULL ) {
1907
1923
goto error ;
1908
1924
}
@@ -2008,7 +2024,8 @@ _hashlib_HMAC_copy_impl(HMACobject *self)
2008
2024
return NULL ;
2009
2025
}
2010
2026
2011
- retval = PyObject_New (HMACobject , Py_TYPE (self ));
2027
+ PyTypeObject * type = Py_TYPE (self );
2028
+ retval = (HMACobject * )type -> tp_alloc (type , 0 );
2012
2029
if (retval == NULL ) {
2013
2030
HMAC_CTX_free (ctx );
2014
2031
return NULL ;
@@ -2022,16 +2039,24 @@ _hashlib_HMAC_copy_impl(HMACobject *self)
2022
2039
static void
2023
2040
_hmac_dealloc (PyObject * op )
2024
2041
{
2042
+ PyTypeObject * tp = Py_TYPE (op );
2043
+ PyObject_GC_UnTrack (op );
2025
2044
HMACobject * self = HMACobject_CAST (op );
2026
- PyTypeObject * tp = Py_TYPE (self );
2027
2045
if (self -> ctx != NULL ) {
2028
2046
HMAC_CTX_free (self -> ctx );
2029
2047
self -> ctx = NULL ;
2030
2048
}
2031
- PyObject_Free (self );
2049
+ tp -> tp_free (self );
2032
2050
Py_DECREF (tp );
2033
2051
}
2034
2052
2053
+ static int
2054
+ _hashlib_HMAC_traverse (PyObject * op , visitproc visit , void * arg )
2055
+ {
2056
+ Py_VISIT (Py_TYPE (op ));
2057
+ return 0 ;
2058
+ }
2059
+
2035
2060
static PyObject *
2036
2061
_hmac_repr (PyObject * op )
2037
2062
{
@@ -2198,15 +2223,21 @@ static PyType_Slot HMACtype_slots[] = {
2198
2223
{Py_tp_doc , (char * )hmactype_doc },
2199
2224
{Py_tp_repr , _hmac_repr },
2200
2225
{Py_tp_dealloc , _hmac_dealloc },
2226
+ {Py_tp_traverse , _hashlib_HMAC_traverse },
2201
2227
{Py_tp_methods , HMAC_methods },
2202
2228
{Py_tp_getset , HMAC_getset },
2203
2229
{0 , NULL }
2204
2230
};
2205
2231
2206
2232
PyType_Spec HMACtype_spec = {
2207
- "_hashlib.HMAC" , /* name */
2208
- sizeof (HMACobject ), /* basicsize */
2209
- .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE ,
2233
+ .name = "_hashlib.HMAC" ,
2234
+ .basicsize = sizeof (HMACobject ),
2235
+ .flags = (
2236
+ Py_TPFLAGS_DEFAULT
2237
+ | Py_TPFLAGS_DISALLOW_INSTANTIATION
2238
+ | Py_TPFLAGS_IMMUTABLETYPE
2239
+ | Py_TPFLAGS_HAVE_GC
2240
+ ),
2210
2241
.slots = HMACtype_slots ,
2211
2242
};
2212
2243
0 commit comments