@@ -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 |
|