@@ -66,6 +66,12 @@ typedef struct binascii_state {
66
66
PyObject * Incomplete ;
67
67
} binascii_state ;
68
68
69
+ static binascii_state *
70
+ get_binascii_state (PyObject * module )
71
+ {
72
+ return (binascii_state * )PyModule_GetState (module );
73
+ }
74
+
69
75
/*
70
76
** hqx lookup table, ascii->binary.
71
77
*/
@@ -1606,9 +1612,9 @@ static struct PyMethodDef binascii_module_methods[] = {
1606
1612
PyDoc_STRVAR (doc_binascii , "Conversion between binary data and ASCII" );
1607
1613
1608
1614
static int
1609
- binascii_exec (PyObject * m ) {
1615
+ binascii_exec (PyObject * module ) {
1610
1616
int result ;
1611
- binascii_state * state = PyModule_GetState (m );
1617
+ binascii_state * state = PyModule_GetState (module );
1612
1618
if (state == NULL ) {
1613
1619
return -1 ;
1614
1620
}
@@ -1617,17 +1623,21 @@ binascii_exec(PyObject *m) {
1617
1623
if (state -> Error == NULL ) {
1618
1624
return -1 ;
1619
1625
}
1620
- result = PyModule_AddObject (m , "Error" , state -> Error );
1626
+ Py_INCREF (state -> Error );
1627
+ result = PyModule_AddObject (module , "Error" , state -> Error );
1621
1628
if (result == -1 ) {
1629
+ Py_DECREF (state -> Error );
1622
1630
return -1 ;
1623
1631
}
1624
1632
1625
1633
state -> Incomplete = PyErr_NewException ("binascii.Incomplete" , NULL , NULL );
1626
1634
if (state -> Incomplete == NULL ) {
1627
1635
return -1 ;
1628
1636
}
1629
- result = PyModule_AddObject (m , "Incomplete" , state -> Incomplete );
1637
+ Py_INCREF (state -> Incomplete );
1638
+ result = PyModule_AddObject (module , "Incomplete" , state -> Incomplete );
1630
1639
if (result == -1 ) {
1640
+ Py_DECREF (state -> Incomplete );
1631
1641
return -1 ;
1632
1642
}
1633
1643
@@ -1639,16 +1649,44 @@ static PyModuleDef_Slot binascii_slots[] = {
1639
1649
{0 , NULL }
1640
1650
};
1641
1651
1652
+ static int
1653
+ binascii_traverse (PyObject * module , visitproc visit , void * arg )
1654
+ {
1655
+ binascii_state * state = get_binascii_state (module );
1656
+ if (state ) {
1657
+ Py_VISIT (state -> Error );
1658
+ Py_VISIT (state -> Incomplete );
1659
+ }
1660
+ return 0 ;
1661
+ }
1662
+
1663
+ static int
1664
+ binascii_clear (PyObject * module )
1665
+ {
1666
+ binascii_state * state = get_binascii_state (module );
1667
+ if (state ) {
1668
+ Py_CLEAR (state -> Error );
1669
+ Py_CLEAR (state -> Incomplete );
1670
+ }
1671
+ return 0 ;
1672
+ }
1673
+
1674
+ static void
1675
+ binascii_free (void * module )
1676
+ {
1677
+ binascii_clear ((PyObject * )module );
1678
+ }
1679
+
1642
1680
static struct PyModuleDef binasciimodule = {
1643
1681
PyModuleDef_HEAD_INIT ,
1644
1682
"binascii" ,
1645
1683
doc_binascii ,
1646
1684
sizeof (binascii_state ),
1647
1685
binascii_module_methods ,
1648
1686
binascii_slots ,
1649
- NULL ,
1650
- NULL ,
1651
- NULL
1687
+ binascii_traverse ,
1688
+ binascii_clear ,
1689
+ binascii_free
1652
1690
};
1653
1691
1654
1692
PyMODINIT_FUNC
0 commit comments