diff -r 05b688aad182 Modules/sha1module.c --- a/Modules/sha1module.c Thu Aug 16 22:11:35 2012 +0200 +++ b/Modules/sha1module.c Thu Aug 16 23:02:45 2012 +0200 @@ -291,22 +291,53 @@ * * ------------------------------------------------------------------------ */ +typedef struct { + PyObject *SHA1type; +} _sha1state; -static PyTypeObject SHA1type; +#define _sha1_state(o) ((_sha1state *)PyModule_GetState(o)) + +static int +_sha1_clear(PyObject *m) +{ + Py_CLEAR(_sha1_state(m)->SHA1type); + return 0; +} + +static int +_sha1_traverse(PyObject *m, visitproc visit, void *arg) +{ + Py_VISIT(_sha1_state(m)->SHA1type); + return 0; +} + +static void +_sha1_free(void *m) +{ + _sha1_clear((PyObject *)m); +} + +static PyModuleDef _sha1module; + +#define _sha1state_global ((_sha1state *)PyModule_GetState(PyState_FindModule(&_sha1module))) static SHA1object * newSHA1object(void) { - return (SHA1object *)PyObject_New(SHA1object, &SHA1type); + Py_INCREF(_sha1state_global->SHA1type); + return (SHA1object *)PyObject_New(SHA1object, (PyTypeObject *)_sha1state_global->SHA1type); } - /* Internal methods for a hash object */ static void SHA1_dealloc(PyObject *ptr) { + PyTypeObject *type = Py_TYPE(ptr); + if((void *)type->tp_dealloc == (void *)SHA1_dealloc) { + Py_DECREF(type); + } PyObject_Del(ptr); } @@ -320,7 +351,7 @@ { SHA1object *newobj; - if (Py_TYPE(self) == &SHA1type) { + if (Py_TYPE(self) == (PyTypeObject *)_sha1state_global->SHA1type) { if ( (newobj = newSHA1object())==NULL) return NULL; } else { @@ -444,40 +475,24 @@ {NULL} /* Sentinel */ }; -static PyTypeObject SHA1type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_sha1.sha1", /*tp_name*/ - sizeof(SHA1object), /*tp_size*/ - 0, /*tp_itemsize*/ - /* methods */ - SHA1_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*/ - SHA1_methods, /* tp_methods */ - NULL, /* tp_members */ - SHA1_getseters, /* tp_getset */ +static PyType_Slot SHA1type_slots[] = { + {Py_tp_dealloc, SHA1_dealloc}, + {Py_tp_methods, SHA1_methods}, + {Py_tp_members, NULL}, + {Py_tp_getset, SHA1_getseters}, + {Py_tp_base, }, + {0, 0} }; +static PyType_Spec SHA1type_spec = { + "_sha1.sha1", + sizeof(SHA1object), + 0, + Py_TPFLAGS_DEFAULT, + SHA1type_slots, +}; + + /* The single module-level function: new() */ @@ -540,19 +555,24 @@ PyModuleDef_HEAD_INIT, "_sha1", NULL, - -1, + sizeof(_sha1state), SHA1_functions, NULL, - NULL, - NULL, - NULL + _sha1_traverse, + _sha1_clear, + _sha1_free }; PyMODINIT_FUNC PyInit__sha1(void) { - Py_TYPE(&SHA1type) = &PyType_Type; - if (PyType_Ready(&SHA1type) < 0) + PyObject *m = PyModule_Create(&_sha1module); + if(m == NULL) return NULL; - return PyModule_Create(&_sha1module); + + _sha1_state(m)->SHA1type = PyType_FromSpec(&SHA1type_spec); + if (_sha1_state(m)->SHA1type == NULL) + return NULL; + + return m; }