@@ -500,7 +500,9 @@ py_digest_by_digestmod(PyObject *module, PyObject *digestmod, enum Py_hash_type
500
500
static EVPobject *
501
501
newEVPobject (PyTypeObject * type )
502
502
{
503
- EVPobject * retval = PyObject_New (EVPobject , type );
503
+ assert (type != NULL );
504
+ assert (type -> tp_alloc != NULL );
505
+ EVPobject * retval = (EVPobject * )type -> tp_alloc (type , 0 );
504
506
if (retval == NULL ) {
505
507
return NULL ;
506
508
}
@@ -541,13 +543,21 @@ EVP_hash(EVPobject *self, const void *vp, Py_ssize_t len)
541
543
static void
542
544
EVP_dealloc (PyObject * op )
543
545
{
546
+ PyTypeObject * tp = Py_TYPE (op );
547
+ PyObject_GC_UnTrack (op );
544
548
EVPobject * self = EVPobject_CAST (op );
545
- PyTypeObject * tp = Py_TYPE (self );
546
549
EVP_MD_CTX_free (self -> ctx );
547
- PyObject_Free (self );
550
+ tp -> tp_free (self );
548
551
Py_DECREF (tp );
549
552
}
550
553
554
+ static int
555
+ EVP_traverse (PyObject * op , visitproc visit , void * arg )
556
+ {
557
+ Py_VISIT (Py_TYPE (op ));
558
+ return 0 ;
559
+ }
560
+
551
561
static int
552
562
locked_EVP_MD_CTX_copy (EVP_MD_CTX * new_ctx_p , EVPobject * self )
553
563
{
@@ -776,6 +786,7 @@ PyDoc_STRVAR(hashtype_doc,
776
786
777
787
static PyType_Slot EVPtype_slots [] = {
778
788
{Py_tp_dealloc , EVP_dealloc },
789
+ {Py_tp_traverse , EVP_traverse },
779
790
{Py_tp_repr , EVP_repr },
780
791
{Py_tp_doc , (char * )hashtype_doc },
781
792
{Py_tp_methods , EVP_methods },
@@ -784,10 +795,15 @@ static PyType_Slot EVPtype_slots[] = {
784
795
};
785
796
786
797
static PyType_Spec EVPtype_spec = {
787
- "_hashlib.HASH" , /*tp_name*/
788
- sizeof (EVPobject ), /*tp_basicsize*/
789
- 0 , /*tp_itemsize*/
790
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE ,
798
+ .name = "_hashlib.HASH" ,
799
+ .basicsize = sizeof (EVPobject ),
800
+ .flags = (
801
+ Py_TPFLAGS_DEFAULT
802
+ | Py_TPFLAGS_BASETYPE
803
+ | Py_TPFLAGS_DISALLOW_INSTANTIATION
804
+ | Py_TPFLAGS_IMMUTABLETYPE
805
+ | Py_TPFLAGS_HAVE_GC
806
+ ),
791
807
EVPtype_slots
792
808
};
793
809
@@ -926,18 +942,25 @@ PyDoc_STRVAR(hashxoftype_doc,
926
942
"digest_size -- number of bytes in this hashes output" );
927
943
928
944
static PyType_Slot EVPXOFtype_slots [] = {
945
+ {Py_tp_dealloc , EVP_dealloc },
946
+ {Py_tp_traverse , EVP_traverse },
929
947
{Py_tp_doc , (char * )hashxoftype_doc },
930
948
{Py_tp_methods , EVPXOF_methods },
931
949
{Py_tp_getset , EVPXOF_getseters },
932
950
{0 , 0 },
933
951
};
934
952
935
953
static PyType_Spec EVPXOFtype_spec = {
936
- "_hashlib.HASHXOF" , /*tp_name*/
937
- sizeof (EVPobject ), /*tp_basicsize*/
938
- 0 , /*tp_itemsize*/
939
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE ,
940
- EVPXOFtype_slots
954
+ .name = "_hashlib.HASHXOF" ,
955
+ .basicsize = sizeof (EVPobject ),
956
+ .flags = (
957
+ Py_TPFLAGS_DEFAULT
958
+ | Py_TPFLAGS_BASETYPE
959
+ | Py_TPFLAGS_DISALLOW_INSTANTIATION
960
+ | Py_TPFLAGS_IMMUTABLETYPE
961
+ | Py_TPFLAGS_HAVE_GC
962
+ ),
963
+ .slots = EVPXOFtype_slots
941
964
};
942
965
943
966
@@ -1621,7 +1644,8 @@ _hashlib_hmac_new_impl(PyObject *module, Py_buffer *key, PyObject *msg_obj,
1621
1644
}
1622
1645
1623
1646
_hashlibstate * state = get_hashlib_state (module );
1624
- self = PyObject_New (HMACobject , state -> HMACtype );
1647
+ assert (state -> HMACtype != NULL );
1648
+ self = (HMACobject * )state -> HMACtype -> tp_alloc (state -> HMACtype , 0 );
1625
1649
if (self == NULL ) {
1626
1650
goto error ;
1627
1651
}
@@ -1726,7 +1750,8 @@ _hashlib_HMAC_copy_impl(HMACobject *self)
1726
1750
return NULL ;
1727
1751
}
1728
1752
1729
- retval = PyObject_New (HMACobject , Py_TYPE (self ));
1753
+ PyTypeObject * type = Py_TYPE (self );
1754
+ retval = (HMACobject * )type -> tp_alloc (type , 0 );
1730
1755
if (retval == NULL ) {
1731
1756
HMAC_CTX_free (ctx );
1732
1757
return NULL ;
@@ -1740,16 +1765,24 @@ _hashlib_HMAC_copy_impl(HMACobject *self)
1740
1765
static void
1741
1766
_hmac_dealloc (PyObject * op )
1742
1767
{
1768
+ PyTypeObject * tp = Py_TYPE (op );
1769
+ PyObject_GC_UnTrack (op );
1743
1770
HMACobject * self = HMACobject_CAST (op );
1744
- PyTypeObject * tp = Py_TYPE (self );
1745
1771
if (self -> ctx != NULL ) {
1746
1772
HMAC_CTX_free (self -> ctx );
1747
1773
self -> ctx = NULL ;
1748
1774
}
1749
- PyObject_Free (self );
1775
+ tp -> tp_free (self );
1750
1776
Py_DECREF (tp );
1751
1777
}
1752
1778
1779
+ static int
1780
+ _hmac_traverse (PyObject * op , visitproc visit , void * arg )
1781
+ {
1782
+ Py_VISIT (Py_TYPE (op ));
1783
+ return 0 ;
1784
+ }
1785
+
1753
1786
static PyObject *
1754
1787
_hmac_repr (PyObject * op )
1755
1788
{
@@ -1922,15 +1955,21 @@ static PyType_Slot HMACtype_slots[] = {
1922
1955
{Py_tp_doc , (char * )hmactype_doc },
1923
1956
{Py_tp_repr , _hmac_repr },
1924
1957
{Py_tp_dealloc , _hmac_dealloc },
1958
+ {Py_tp_traverse , _hmac_traverse },
1925
1959
{Py_tp_methods , HMAC_methods },
1926
1960
{Py_tp_getset , HMAC_getset },
1927
1961
{0 , NULL }
1928
1962
};
1929
1963
1930
1964
PyType_Spec HMACtype_spec = {
1931
- "_hashlib.HMAC" , /* name */
1932
- sizeof (HMACobject ), /* basicsize */
1933
- .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE ,
1965
+ .name = "_hashlib.HMAC" ,
1966
+ .basicsize = sizeof (HMACobject ),
1967
+ .flags = (
1968
+ Py_TPFLAGS_DEFAULT
1969
+ | Py_TPFLAGS_DISALLOW_INSTANTIATION
1970
+ | Py_TPFLAGS_IMMUTABLETYPE
1971
+ | Py_TPFLAGS_HAVE_GC
1972
+ ),
1934
1973
.slots = HMACtype_slots ,
1935
1974
};
1936
1975
0 commit comments