@@ -2480,7 +2480,25 @@ hashlib_free(void *m)
24802480 (void )hashlib_clear ((PyObject * )m );
24812481}
24822482
2483- /* Py_mod_exec functions */
2483+ // --- Py_mod_exec helpers ----------------------------------------------------
2484+
2485+ static int
2486+ hashlib_make_type (PyTypeObject * * out ,
2487+ PyObject * module , PyType_Spec * specs , PyObject * bases )
2488+ {
2489+ assert (out != NULL );
2490+ * out = (PyTypeObject * )PyType_FromModuleAndSpec (module , specs , bases );
2491+ if (* out == NULL ) {
2492+ return -1 ;
2493+ }
2494+ if (PyModule_AddType (module , * out ) < 0 ) {
2495+ return -1 ;
2496+ }
2497+ return 0 ;
2498+ }
2499+
2500+ // --- Py_mod_exec functions --------------------------------------------------
2501+
24842502static int
24852503hashlib_init_hashtable (PyObject * module )
24862504{
@@ -2498,53 +2516,35 @@ static int
24982516hashlib_init_HASH_type (PyObject * module )
24992517{
25002518 _hashlibstate * state = get_hashlib_state (module );
2501-
2502- state -> HASH_type = (PyTypeObject * )PyType_FromSpec (& HASHobject_type_spec );
2503- if (state -> HASH_type == NULL ) {
2504- return -1 ;
2505- }
2506- if (PyModule_AddType (module , state -> HASH_type ) < 0 ) {
2507- return -1 ;
2508- }
2509- return 0 ;
2519+ return hashlib_make_type (
2520+ & state -> HASH_type ,
2521+ module , & HASHobject_type_spec , NULL
2522+ );
25102523}
25112524
25122525static int
25132526hashlib_init_HASHXOF_type (PyObject * module )
25142527{
25152528#ifdef PY_OPENSSL_HAS_SHAKE
25162529 _hashlibstate * state = get_hashlib_state (module );
2517-
2518- if (state -> HASH_type == NULL ) {
2519- return -1 ;
2520- }
2521-
2522- state -> HASHXOF_type = (PyTypeObject * )PyType_FromSpecWithBases (
2523- & HASHXOFobject_type_spec , (PyObject * )state -> HASH_type
2530+ assert (state -> HASH_type != NULL );
2531+ return hashlib_make_type (
2532+ & state -> HASHXOF_type ,
2533+ module , & HASHXOFobject_type_spec , (PyObject * )state -> HASH_type
25242534 );
2525- if (state -> HASHXOF_type == NULL ) {
2526- return -1 ;
2527- }
2528- if (PyModule_AddType (module , state -> HASHXOF_type ) < 0 ) {
2529- return -1 ;
2530- }
2531- #endif
2535+ #else
25322536 return 0 ;
2537+ #endif
25332538}
25342539
25352540static int
25362541hashlib_init_hmactype (PyObject * module )
25372542{
25382543 _hashlibstate * state = get_hashlib_state (module );
2539-
2540- state -> HMAC_type = (PyTypeObject * )PyType_FromSpec (& HMACtype_spec );
2541- if (state -> HMAC_type == NULL ) {
2542- return -1 ;
2543- }
2544- if (PyModule_AddType (module , state -> HMAC_type ) < 0 ) {
2545- return -1 ;
2546- }
2547- return 0 ;
2544+ return hashlib_make_type (
2545+ & state -> HMAC_type ,
2546+ module , & HMACtype_spec , NULL
2547+ );
25482548}
25492549
25502550static int
0 commit comments