1515#include "osdefs.h" // MAXPATHLEN
1616
1717
18+ #define _PyModule_CAST (op ) \
19+ (assert(PyModule_Check(op)), _Py_CAST(PyModuleObject*, (op)))
20+
21+
1822static PyMemberDef module_members [] = {
1923 {"__dict__" , _Py_T_OBJECT , offsetof(PyModuleObject , md_dict ), Py_READONLY },
2024 {0 }
@@ -225,7 +229,9 @@ _PyModule_CreateInitialized(PyModuleDef* module, int module_api_version)
225229 return NULL ;
226230 }
227231 name = _PyImport_ResolveNameWithPackageContext (name );
228- if ((m = (PyModuleObject * )PyModule_New (name )) == NULL )
232+
233+ m = (PyModuleObject * )PyModule_New (name );
234+ if (m == NULL )
229235 return NULL ;
230236
231237 if (module -> m_size > 0 ) {
@@ -758,22 +764,26 @@ module___init___impl(PyModuleObject *self, PyObject *name, PyObject *doc)
758764}
759765
760766static void
761- module_dealloc (PyModuleObject * m )
767+ module_dealloc (PyObject * self )
762768{
763- int verbose = _Py_GetConfig () -> verbose ;
769+ PyModuleObject * m = _PyModule_CAST ( self ) ;
764770
765771 PyObject_GC_UnTrack (m );
772+
773+ int verbose = _Py_GetConfig ()-> verbose ;
766774 if (verbose && m -> md_name ) {
767775 PySys_FormatStderr ("# destroy %U\n" , m -> md_name );
768776 }
769777 if (m -> md_weaklist != NULL )
770778 PyObject_ClearWeakRefs ((PyObject * ) m );
779+
771780 /* bpo-39824: Don't call m_free() if m_size > 0 and md_state=NULL */
772781 if (m -> md_def && m -> md_def -> m_free
773782 && (m -> md_def -> m_size <= 0 || m -> md_state != NULL ))
774783 {
775784 m -> md_def -> m_free (m );
776785 }
786+
777787 Py_XDECREF (m -> md_dict );
778788 Py_XDECREF (m -> md_name );
779789 if (m -> md_state != NULL )
@@ -782,8 +792,9 @@ module_dealloc(PyModuleObject *m)
782792}
783793
784794static PyObject *
785- module_repr (PyModuleObject * m )
795+ module_repr (PyObject * self )
786796{
797+ PyModuleObject * m = _PyModule_CAST (self );
787798 PyInterpreterState * interp = _PyInterpreterState_GET ();
788799 return _PyImport_ImportlibModuleRepr (interp , (PyObject * )m );
789800}
@@ -1062,14 +1073,17 @@ _Py_module_getattro_impl(PyModuleObject *m, PyObject *name, int suppress)
10621073
10631074
10641075PyObject *
1065- _Py_module_getattro (PyModuleObject * m , PyObject * name )
1076+ _Py_module_getattro (PyObject * self , PyObject * name )
10661077{
1078+ PyModuleObject * m = _PyModule_CAST (self );
10671079 return _Py_module_getattro_impl (m , name , 0 );
10681080}
10691081
10701082static int
1071- module_traverse (PyModuleObject * m , visitproc visit , void * arg )
1083+ module_traverse (PyObject * self , visitproc visit , void * arg )
10721084{
1085+ PyModuleObject * m = _PyModule_CAST (self );
1086+
10731087 /* bpo-39824: Don't call m_traverse() if m_size > 0 and md_state=NULL */
10741088 if (m -> md_def && m -> md_def -> m_traverse
10751089 && (m -> md_def -> m_size <= 0 || m -> md_state != NULL ))
@@ -1078,13 +1092,16 @@ module_traverse(PyModuleObject *m, visitproc visit, void *arg)
10781092 if (res )
10791093 return res ;
10801094 }
1095+
10811096 Py_VISIT (m -> md_dict );
10821097 return 0 ;
10831098}
10841099
10851100static int
1086- module_clear (PyModuleObject * m )
1101+ module_clear (PyObject * self )
10871102{
1103+ PyModuleObject * m = _PyModule_CAST (self );
1104+
10881105 /* bpo-39824: Don't call m_clear() if m_size > 0 and md_state=NULL */
10891106 if (m -> md_def && m -> md_def -> m_clear
10901107 && (m -> md_def -> m_size <= 0 || m -> md_state != NULL ))
@@ -1149,8 +1166,10 @@ module_get_dict(PyModuleObject *m)
11491166}
11501167
11511168static PyObject *
1152- module_get_annotate (PyModuleObject * m , void * Py_UNUSED (ignored ))
1169+ module_get_annotate (PyObject * self , void * Py_UNUSED (ignored ))
11531170{
1171+ PyModuleObject * m = _PyModule_CAST (self );
1172+
11541173 PyObject * dict = module_get_dict (m );
11551174 if (dict == NULL ) {
11561175 return NULL ;
@@ -1168,12 +1187,14 @@ module_get_annotate(PyModuleObject *m, void *Py_UNUSED(ignored))
11681187}
11691188
11701189static int
1171- module_set_annotate (PyModuleObject * m , PyObject * value , void * Py_UNUSED (ignored ))
1190+ module_set_annotate (PyObject * self , PyObject * value , void * Py_UNUSED (ignored ))
11721191{
1192+ PyModuleObject * m = _PyModule_CAST (self );
11731193 if (value == NULL ) {
11741194 PyErr_SetString (PyExc_TypeError , "cannot delete __annotate__ attribute" );
11751195 return -1 ;
11761196 }
1197+
11771198 PyObject * dict = module_get_dict (m );
11781199 if (dict == NULL ) {
11791200 return -1 ;
@@ -1200,8 +1221,10 @@ module_set_annotate(PyModuleObject *m, PyObject *value, void *Py_UNUSED(ignored)
12001221}
12011222
12021223static PyObject *
1203- module_get_annotations (PyModuleObject * m , void * Py_UNUSED (ignored ))
1224+ module_get_annotations (PyObject * self , void * Py_UNUSED (ignored ))
12041225{
1226+ PyModuleObject * m = _PyModule_CAST (self );
1227+
12051228 PyObject * dict = module_get_dict (m );
12061229 if (dict == NULL ) {
12071230 return NULL ;
@@ -1249,14 +1272,16 @@ module_get_annotations(PyModuleObject *m, void *Py_UNUSED(ignored))
12491272}
12501273
12511274static int
1252- module_set_annotations (PyModuleObject * m , PyObject * value , void * Py_UNUSED (ignored ))
1275+ module_set_annotations (PyObject * self , PyObject * value , void * Py_UNUSED (ignored ))
12531276{
1254- int ret = -1 ;
1277+ PyModuleObject * m = _PyModule_CAST (self );
1278+
12551279 PyObject * dict = module_get_dict (m );
12561280 if (dict == NULL ) {
12571281 return -1 ;
12581282 }
12591283
1284+ int ret = -1 ;
12601285 if (value != NULL ) {
12611286 /* set */
12621287 ret = PyDict_SetItem (dict , & _Py_ID (__annotations__ ), value );
@@ -1282,8 +1307,8 @@ module_set_annotations(PyModuleObject *m, PyObject *value, void *Py_UNUSED(ignor
12821307
12831308
12841309static PyGetSetDef module_getsets [] = {
1285- {"__annotations__" , ( getter ) module_get_annotations , ( setter ) module_set_annotations },
1286- {"__annotate__" , ( getter ) module_get_annotate , ( setter ) module_set_annotate },
1310+ {"__annotations__" , module_get_annotations , module_set_annotations },
1311+ {"__annotate__" , module_get_annotate , module_set_annotate },
12871312 {NULL }
12881313};
12891314
@@ -1292,26 +1317,26 @@ PyTypeObject PyModule_Type = {
12921317 "module" , /* tp_name */
12931318 sizeof (PyModuleObject ), /* tp_basicsize */
12941319 0 , /* tp_itemsize */
1295- ( destructor ) module_dealloc , /* tp_dealloc */
1320+ module_dealloc , /* tp_dealloc */
12961321 0 , /* tp_vectorcall_offset */
12971322 0 , /* tp_getattr */
12981323 0 , /* tp_setattr */
12991324 0 , /* tp_as_async */
1300- ( reprfunc ) module_repr , /* tp_repr */
1325+ module_repr , /* tp_repr */
13011326 0 , /* tp_as_number */
13021327 0 , /* tp_as_sequence */
13031328 0 , /* tp_as_mapping */
13041329 0 , /* tp_hash */
13051330 0 , /* tp_call */
13061331 0 , /* tp_str */
1307- ( getattrofunc ) _Py_module_getattro , /* tp_getattro */
1332+ _Py_module_getattro , /* tp_getattro */
13081333 PyObject_GenericSetAttr , /* tp_setattro */
13091334 0 , /* tp_as_buffer */
13101335 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
13111336 Py_TPFLAGS_BASETYPE , /* tp_flags */
13121337 module___init____doc__ , /* tp_doc */
1313- ( traverseproc ) module_traverse , /* tp_traverse */
1314- ( inquiry ) module_clear , /* tp_clear */
1338+ module_traverse , /* tp_traverse */
1339+ module_clear , /* tp_clear */
13151340 0 , /* tp_richcompare */
13161341 offsetof(PyModuleObject , md_weaklist ), /* tp_weaklistoffset */
13171342 0 , /* tp_iter */
0 commit comments