diff -r 56b970009aef Modules/sha512module.c --- a/Modules/sha512module.c Thu Aug 16 23:07:25 2012 +0200 +++ b/Modules/sha512module.c Thu Aug 16 23:10:56 2012 +0200 @@ -441,21 +441,55 @@ * * ------------------------------------------------------------------------ */ +typedef struct { + PyObject *SHA384type; + PyObject *SHA512type; +} _sha512state; -static PyTypeObject SHA384type; -static PyTypeObject SHA512type; + +#define _sha512_state(o) ((_sha512state *)PyModule_GetState(o)) + +static int +_sha512_clear(PyObject *m) +{ + Py_CLEAR(_sha512_state(m)->SHA384type); + Py_CLEAR(_sha512_state(m)->SHA512type); + return 0; +} + +static int +_sha512_traverse(PyObject *m, visitproc visit, void *arg) +{ + Py_VISIT(_sha512_state(m)->SHA384type); + Py_VISIT(_sha512_state(m)->SHA512type); + return 0; +} + +static void +_sha512_free(void *m) +{ + _sha512_clear((PyObject *)m); +} + +static PyModuleDef _sha512module; + +#define _sha512state_global ((_sha512state *)PyModule_GetState(PyState_FindModule(&_sha512module))) + + static SHAobject * newSHA384object(void) { - return (SHAobject *)PyObject_New(SHAobject, &SHA384type); + return (SHAobject *)PyObject_New(SHAobject, + (PyTypeObject *)_sha512state_global->SHA384type); } static SHAobject * newSHA512object(void) { - return (SHAobject *)PyObject_New(SHAobject, &SHA512type); + return (SHAobject *)PyObject_New(SHAobject, + (PyTypeObject *)_sha512state_global->SHA512type); } /* Internal methods for a hash object */ @@ -476,7 +510,7 @@ { SHAobject *newobj; - if (((PyObject*)self)->ob_type == &SHA512type) { + if (((PyObject*)self)->ob_type == (PyTypeObject *)_sha512state_global->SHA512type) { if ( (newobj = newSHA512object())==NULL) return NULL; } else { @@ -597,74 +631,39 @@ {NULL} /* Sentinel */ }; -static PyTypeObject SHA384type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_sha512.sha384", /*tp_name*/ - sizeof(SHAobject), /*tp_size*/ - 0, /*tp_itemsize*/ - /* methods */ - SHA512_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_reserved*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - SHA_methods, /* tp_methods */ - SHA_members, /* tp_members */ - SHA_getseters, /* tp_getset */ +static PyType_Slot SHA384type_slots[] = { + {Py_tp_dealloc, SHA512_dealloc}, + {Py_tp_methods, SHA_methods}, + {Py_tp_members, SHA_members}, + {Py_tp_getset, SHA_getseters}, + {0, 0} }; -static PyTypeObject SHA512type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_sha512.sha512", /*tp_name*/ - sizeof(SHAobject), /*tp_size*/ - 0, /*tp_itemsize*/ - /* methods */ - SHA512_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_reserved*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - SHA_methods, /* tp_methods */ - SHA_members, /* tp_members */ - SHA_getseters, /* tp_getset */ +static PyType_Spec SHA384type_spec = { + "_sha512.sha384", + sizeof(SHAobject), + 0, + Py_TPFLAGS_DEFAULT, + SHA384type_slots, }; +static PyType_Slot SHA512type_slots[] = { + {Py_tp_dealloc, SHA512_dealloc}, + {Py_tp_methods, SHA_methods}, + {Py_tp_members, SHA_members}, + {Py_tp_getset, SHA_getseters}, + {0, 0} +}; + +static PyType_Spec SHA512type_spec = { + "_sha512.sha512", + sizeof(SHAobject), + 0, + Py_TPFLAGS_DEFAULT, + SHA512type_slots, +}; + + /* The single module-level function: new() */ @@ -769,24 +768,27 @@ PyModuleDef_HEAD_INIT, "_sha512", NULL, - -1, + sizeof(_sha512state), SHA_functions, NULL, - NULL, - NULL, - NULL + _sha512_traverse, + _sha512_clear, + _sha512_free }; PyMODINIT_FUNC PyInit__sha512(void) { - Py_TYPE(&SHA384type) = &PyType_Type; - if (PyType_Ready(&SHA384type) < 0) + PyObject *m = PyModule_Create(&_sha512module); + if(m == NULL) return NULL; - Py_TYPE(&SHA512type) = &PyType_Type; - if (PyType_Ready(&SHA512type) < 0) + _sha512_state(m)->SHA384type = PyType_FromSpec(&SHA384type_spec); + if (_sha512_state(m)->SHA384type == NULL) return NULL; - return PyModule_Create(&_sha512module); + _sha512_state(m)->SHA512type = PyType_FromSpec(&SHA512type_spec); + if (_sha512_state(m)->SHA512type == NULL) + return NULL; + return m; } #endif