@@ -66,6 +66,12 @@ typedef struct binascii_state {
6666 PyObject * Incomplete ;
6767} binascii_state ;
6868
69+ static binascii_state *
70+ get_binascii_state (PyObject * module )
71+ {
72+ return (binascii_state * )PyModule_GetState (module );
73+ }
74+
6975/*
7076** hqx lookup table, ascii->binary.
7177*/
@@ -1606,9 +1612,9 @@ static struct PyMethodDef binascii_module_methods[] = {
16061612PyDoc_STRVAR (doc_binascii , "Conversion between binary data and ASCII" );
16071613
16081614static int
1609- binascii_exec (PyObject * m ) {
1615+ binascii_exec (PyObject * module ) {
16101616 int result ;
1611- binascii_state * state = PyModule_GetState (m );
1617+ binascii_state * state = PyModule_GetState (module );
16121618 if (state == NULL ) {
16131619 return -1 ;
16141620 }
@@ -1617,17 +1623,21 @@ binascii_exec(PyObject *m) {
16171623 if (state -> Error == NULL ) {
16181624 return -1 ;
16191625 }
1620- result = PyModule_AddObject (m , "Error" , state -> Error );
1626+ Py_INCREF (state -> Error );
1627+ result = PyModule_AddObject (module , "Error" , state -> Error );
16211628 if (result == -1 ) {
1629+ Py_DECREF (state -> Error );
16221630 return -1 ;
16231631 }
16241632
16251633 state -> Incomplete = PyErr_NewException ("binascii.Incomplete" , NULL , NULL );
16261634 if (state -> Incomplete == NULL ) {
16271635 return -1 ;
16281636 }
1629- result = PyModule_AddObject (m , "Incomplete" , state -> Incomplete );
1637+ Py_INCREF (state -> Incomplete );
1638+ result = PyModule_AddObject (module , "Incomplete" , state -> Incomplete );
16301639 if (result == -1 ) {
1640+ Py_DECREF (state -> Incomplete );
16311641 return -1 ;
16321642 }
16331643
@@ -1639,16 +1649,44 @@ static PyModuleDef_Slot binascii_slots[] = {
16391649 {0 , NULL }
16401650};
16411651
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+
16421680static struct PyModuleDef binasciimodule = {
16431681 PyModuleDef_HEAD_INIT ,
16441682 "binascii" ,
16451683 doc_binascii ,
16461684 sizeof (binascii_state ),
16471685 binascii_module_methods ,
16481686 binascii_slots ,
1649- NULL ,
1650- NULL ,
1651- NULL
1687+ binascii_traverse ,
1688+ binascii_clear ,
1689+ binascii_free
16521690};
16531691
16541692PyMODINIT_FUNC
0 commit comments