diff -r 4e1c0c7ac7f1 Modules/sha256module.c --- a/Modules/sha256module.c Thu Aug 16 23:02:26 2012 +0200 +++ b/Modules/sha256module.c Thu Aug 16 23:07:41 2012 +0200 @@ -376,20 +376,51 @@ * ------------------------------------------------------------------------ */ -static PyTypeObject SHA224type; -static PyTypeObject SHA256type; +typedef struct { + PyObject *SHA224type; + PyObject *SHA256type; +} _sha256state; + + +#define _sha256_state(o) ((_sha256state *)PyModule_GetState(o)) + +static int +_sha256_clear(PyObject *m) +{ + Py_CLEAR(_sha256_state(m)->SHA224type); + Py_CLEAR(_sha256_state(m)->SHA256type); + return 0; +} + +static int +_sha256_traverse(PyObject *m, visitproc visit, void *arg) +{ + Py_VISIT(_sha256_state(m)->SHA224type); + Py_VISIT(_sha256_state(m)->SHA256type); + return 0; +} + +static void +_sha256_free(void *m) +{ + _sha256_clear((PyObject *)m); +} + +static PyModuleDef _sha256module; + +#define _sha256state_global ((_sha256state *)PyModule_GetState(PyState_FindModule(&_sha256module))) static SHAobject * newSHA224object(void) { - return (SHAobject *)PyObject_New(SHAobject, &SHA224type); + return (SHAobject *)PyObject_New(SHAobject, (PyTypeObject *)_sha256state_global->SHA224type); } static SHAobject * newSHA256object(void) { - return (SHAobject *)PyObject_New(SHAobject, &SHA256type); + return (SHAobject *)PyObject_New(SHAobject, (PyTypeObject *)_sha256state_global->SHA256type); } /* Internal methods for a hash object */ @@ -397,6 +428,10 @@ static void SHA_dealloc(PyObject *ptr) { + PyTypeObject *type = Py_TYPE(ptr); + if((void *)type->tp_dealloc == (void *)SHA_dealloc) { + Py_INCREF(type); + } PyObject_Del(ptr); } @@ -410,7 +445,7 @@ { SHAobject *newobj; - if (Py_TYPE(self) == &SHA256type) { + if (Py_TYPE(self) == (PyTypeObject *)_sha256state_global->SHA256type) { if ( (newobj = newSHA256object())==NULL) return NULL; } else { @@ -531,74 +566,39 @@ {NULL} /* Sentinel */ }; -static PyTypeObject SHA224type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_sha256.sha224", /*tp_name*/ - sizeof(SHAobject), /*tp_size*/ - 0, /*tp_itemsize*/ - /* methods */ - SHA_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 SHA224type_slots[] = { + {Py_tp_dealloc, SHA_dealloc}, + {Py_tp_methods, SHA_methods}, + {Py_tp_members, SHA_members}, + {Py_tp_getset, SHA_getseters}, + {0, 0} }; -static PyTypeObject SHA256type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_sha256.sha256", /*tp_name*/ - sizeof(SHAobject), /*tp_size*/ - 0, /*tp_itemsize*/ - /* methods */ - SHA_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 SHA224type_spec = { + "_sha256.sha224", + sizeof(SHAobject), + 0, + Py_TPFLAGS_DEFAULT, + SHA224type_slots, }; +static PyType_Slot SHA256type_slots[] = { + {Py_tp_dealloc, SHA_dealloc}, + {Py_tp_methods, SHA_methods}, + {Py_tp_members, SHA_members}, + {Py_tp_getset, SHA_getseters}, + {0, 0} +}; + +static PyType_Spec SHA256type_spec = { + "_sha256.sha256", + sizeof(SHAobject), + 0, + Py_TPFLAGS_DEFAULT, + SHA256type_slots, +}; + + /* The single module-level function: new() */ @@ -703,22 +703,25 @@ PyModuleDef_HEAD_INIT, "_sha256", NULL, - -1, + sizeof(_sha256state), SHA_functions, NULL, - NULL, - NULL, - NULL + _sha256_traverse, + _sha256_clear, + _sha256_free }; PyMODINIT_FUNC PyInit__sha256(void) { - Py_TYPE(&SHA224type) = &PyType_Type; - if (PyType_Ready(&SHA224type) < 0) + PyObject *m = PyModule_Create(&_sha256module); + if(m == NULL) return NULL; - Py_TYPE(&SHA256type) = &PyType_Type; - if (PyType_Ready(&SHA256type) < 0) + _sha256_state(m)->SHA224type = PyType_FromSpec(&SHA224type_spec); + if (_sha256_state(m)->SHA224type == NULL) return NULL; - return PyModule_Create(&_sha256module); + _sha256_state(m)->SHA256type = PyType_FromSpec(&SHA256type_spec); + if (_sha256_state(m)->SHA256type == NULL) + return NULL; + return m; }