@@ -64,8 +64,7 @@ module_init_dict(PyModuleObject *mod, PyObject *md_dict,
6464 _Py_IDENTIFIER (__package__ );
6565 _Py_IDENTIFIER (__loader__ );
6666
67- if (md_dict == NULL )
68- return -1 ;
67+ assert (md_dict != NULL );
6968 if (doc == NULL )
7069 doc = Py_None ;
7170
@@ -87,19 +86,41 @@ module_init_dict(PyModuleObject *mod, PyObject *md_dict,
8786 return 0 ;
8887}
8988
90-
91- PyObject *
92- PyModule_NewObject (PyObject * name )
89+ static PyModuleObject *
90+ new_module_notrack (PyTypeObject * mt )
9391{
9492 PyModuleObject * m ;
95- m = PyObject_GC_New (PyModuleObject , & PyModule_Type );
93+ m = PyObject_GC_New (PyModuleObject , mt );
9694 if (m == NULL )
9795 return NULL ;
9896 m -> md_def = NULL ;
9997 m -> md_state = NULL ;
10098 m -> md_weaklist = NULL ;
10199 m -> md_name = NULL ;
102100 m -> md_dict = PyDict_New ();
101+ if (m -> md_dict != NULL ) {
102+ return m ;
103+ }
104+ Py_DECREF (m );
105+ return NULL ;
106+ }
107+
108+ static PyObject *
109+ new_module (PyTypeObject * mt , PyObject * args , PyObject * kws )
110+ {
111+ PyObject * m = (PyObject * )new_module_notrack (mt );
112+ if (m != NULL ) {
113+ PyObject_GC_Track (m );
114+ }
115+ return m ;
116+ }
117+
118+ PyObject *
119+ PyModule_NewObject (PyObject * name )
120+ {
121+ PyModuleObject * m = new_module_notrack (& PyModule_Type );
122+ if (m == NULL )
123+ return NULL ;
103124 if (module_init_dict (m , m -> md_dict , name , NULL ) != 0 )
104125 goto fail ;
105126 PyObject_GC_Track (m );
@@ -728,43 +749,42 @@ module_getattro(PyModuleObject *m, PyObject *name)
728749 return attr ;
729750 }
730751 PyErr_Clear ();
731- if (m -> md_dict ) {
732- _Py_IDENTIFIER (__getattr__ );
733- getattr = _PyDict_GetItemIdWithError (m -> md_dict , & PyId___getattr__ );
734- if (getattr ) {
735- return PyObject_CallOneArg (getattr , name );
736- }
737- if (PyErr_Occurred ()) {
738- return NULL ;
739- }
740- mod_name = _PyDict_GetItemIdWithError (m -> md_dict , & PyId___name__ );
741- if (mod_name && PyUnicode_Check (mod_name )) {
742- Py_INCREF (mod_name );
743- PyObject * spec = _PyDict_GetItemIdWithError (m -> md_dict , & PyId___spec__ );
744- if (spec == NULL && PyErr_Occurred ()) {
745- Py_DECREF (mod_name );
746- return NULL ;
747- }
748- Py_XINCREF (spec );
749- if (_PyModuleSpec_IsInitializing (spec )) {
750- PyErr_Format (PyExc_AttributeError ,
751- "partially initialized "
752- "module '%U' has no attribute '%U' "
753- "(most likely due to a circular import)" ,
754- mod_name , name );
755- }
756- else {
757- PyErr_Format (PyExc_AttributeError ,
758- "module '%U' has no attribute '%U'" ,
759- mod_name , name );
760- }
761- Py_XDECREF (spec );
752+ assert (m -> md_dict != NULL );
753+ _Py_IDENTIFIER (__getattr__ );
754+ getattr = _PyDict_GetItemIdWithError (m -> md_dict , & PyId___getattr__ );
755+ if (getattr ) {
756+ return PyObject_CallOneArg (getattr , name );
757+ }
758+ if (PyErr_Occurred ()) {
759+ return NULL ;
760+ }
761+ mod_name = _PyDict_GetItemIdWithError (m -> md_dict , & PyId___name__ );
762+ if (mod_name && PyUnicode_Check (mod_name )) {
763+ Py_INCREF (mod_name );
764+ PyObject * spec = _PyDict_GetItemIdWithError (m -> md_dict , & PyId___spec__ );
765+ if (spec == NULL && PyErr_Occurred ()) {
762766 Py_DECREF (mod_name );
763767 return NULL ;
764768 }
765- else if (PyErr_Occurred ()) {
766- return NULL ;
769+ Py_XINCREF (spec );
770+ if (_PyModuleSpec_IsInitializing (spec )) {
771+ PyErr_Format (PyExc_AttributeError ,
772+ "partially initialized "
773+ "module '%U' has no attribute '%U' "
774+ "(most likely due to a circular import)" ,
775+ mod_name , name );
767776 }
777+ else {
778+ PyErr_Format (PyExc_AttributeError ,
779+ "module '%U' has no attribute '%U'" ,
780+ mod_name , name );
781+ }
782+ Py_XDECREF (spec );
783+ Py_DECREF (mod_name );
784+ return NULL ;
785+ }
786+ else if (PyErr_Occurred ()) {
787+ return NULL ;
768788 }
769789 PyErr_Format (PyExc_AttributeError ,
770790 "module has no attribute '%U'" , name );
@@ -948,7 +968,7 @@ PyTypeObject PyModule_Type = {
948968 0 , /* tp_descr_set */
949969 offsetof(PyModuleObject , md_dict ), /* tp_dictoffset */
950970 module___init__ , /* tp_init */
951- PyType_GenericAlloc , /* tp_alloc */
952- PyType_GenericNew , /* tp_new */
971+ 0 , /* tp_alloc */
972+ new_module , /* tp_new */
953973 PyObject_GC_Del , /* tp_free */
954974};
0 commit comments