@ -296,6 +296,17 @@ PyImport_GetModuleDict(void)
return interp - > modules ;
}
/* In some corner cases it is important to be sure that the import
machinery has been initialized ( or not cleaned up yet ) . For
example , see issue # 4236 and PyModule_Create2 ( ) . */
int
_PyImport_IsInitialized ( PyInterpreterState * interp )
{
if ( interp - > modules = = NULL )
return 0 ;
return 1 ;
}
/* List of names to clear in sys */
static const char * const sys_deletes [ ] = {
@ -323,7 +334,7 @@ PyImport_Cleanup(void)
Py_ssize_t pos ;
PyObject * key , * value , * dict ;
PyInterpreterState * interp = PyThreadState_GET ( ) - > interp ;
PyObject * modules = interp - > modules ;
PyObject * modules = PyImport_GetModuleDict ( ) ;
PyObject * weaklist = NULL ;
const char * const * p ;
@ -511,9 +522,9 @@ PyImport_GetMagicTag(void)
int
_PyImport_FixupExtensionObject ( PyObject * mod , PyObject * name ,
PyObject * filename )
PyObject * filename , PyObject * modules )
{
PyObject * modules , * dict , * key ;
PyObject * dict , * key ;
struct PyModuleDef * def ;
int res ;
if ( extensions = = NULL ) {
@ -530,7 +541,6 @@ _PyImport_FixupExtensionObject(PyObject *mod, PyObject *name,
PyErr_BadInternalCall ( ) ;
return - 1 ;
}
modules = PyImport_GetModuleDict ( ) ;
if ( PyDict_SetItem ( modules , name , mod ) < 0 )
return - 1 ;
if ( _PyState_AddModule ( mod , def ) < 0 ) {
@ -562,20 +572,28 @@ _PyImport_FixupExtensionObject(PyObject *mod, PyObject *name,
}
int
_PyImport_FixupBuiltin ( PyObject * mod , const char * name )
_PyImport_FixupBuiltin ( PyObject * mod , const char * name , PyObject * modules )
{
int res ;
PyObject * nameobj ;
nameobj = PyUnicode_InternFromString ( name ) ;
if ( nameobj = = NULL )
return - 1 ;
res = _PyImport_FixupExtensionObject ( mod , nameobj , nameobj ) ;
res = _PyImport_FixupExtensionObject ( mod , nameobj , nameobj , modules ) ;
Py_DECREF ( nameobj ) ;
return res ;
}
PyObject *
_PyImport_FindExtensionObject ( PyObject * name , PyObject * filename )
{
PyObject * modules = PyImport_GetModuleDict ( ) ;
return _PyImport_FindExtensionObjectEx ( name , filename , modules ) ;
}
PyObject *
_PyImport_FindExtensionObjectEx ( PyObject * name , PyObject * filename ,
PyObject * modules )
{
PyObject * mod , * mdict , * key ;
PyModuleDef * def ;
@ -592,7 +610,7 @@ _PyImport_FindExtensionObject(PyObject *name, PyObject *filename)
/* Module does not support repeated initialization */
if ( def - > m_base . m_copy = = NULL )
return NULL ;
mod = PyImport_AddModuleObject ( name ) ;
mod = _ PyImport_AddModuleObject( name , modules ) ;
if ( mod = = NULL )
return NULL ;
mdict = PyModule_GetDict ( mod ) ;
@ -607,14 +625,14 @@ _PyImport_FindExtensionObject(PyObject *name, PyObject *filename)
mod = def - > m_base . m_init ( ) ;
if ( mod = = NULL )
return NULL ;
if ( PyDict_SetItem ( PyI mport_GetM oduleDict ( ) , name , mod ) = = - 1 ) {
if ( PyDict_SetItem ( modules , name , mod ) = = - 1 ) {
Py_DECREF ( mod ) ;
return NULL ;
}
Py_DECREF ( mod ) ;
}
if ( _PyState_AddModule ( mod , def ) < 0 ) {
PyDict_DelItem ( PyI mport_GetM oduleDict ( ) , name ) ;
PyDict_DelItem ( modules , name ) ;
Py_DECREF ( mod ) ;
return NULL ;
}
@ -626,13 +644,13 @@ _PyImport_FindExtensionObject(PyObject *name, PyObject *filename)
}
PyObject *
_PyImport_FindBuiltin ( const char * name )
_PyImport_FindBuiltin ( const char * name , PyObject * modules )
{
PyObject * res , * nameobj ;
nameobj = PyUnicode_InternFromString ( name ) ;
if ( nameobj = = NULL )
return NULL ;
res = _PyImport_FindExtensionObject ( nameobj , nameobj ) ;
res = _PyImport_FindExtensionObjectEx ( nameobj , nameobj , modules ) ;
Py_DECREF ( nameobj ) ;
return res ;
}
@ -647,6 +665,12 @@ PyObject *
PyImport_AddModuleObject ( PyObject * name )
{
PyObject * modules = PyImport_GetModuleDict ( ) ;
return _PyImport_AddModuleObject ( name , modules ) ;
}
PyObject *
_PyImport_AddModuleObject ( PyObject * name , PyObject * modules )
{
PyObject * m ;
if ( ( m = PyDict_GetItemWithError ( modules , name ) ) ! = NULL & &
@ -1042,6 +1066,7 @@ _imp_create_builtin(PyObject *module, PyObject *spec)
return NULL ;
}
PyObject * modules = NULL ;
for ( p = PyImport_Inittab ; p - > name ! = NULL ; p + + ) {
PyModuleDef * def ;
if ( _PyUnicode_EqualToASCIIString ( name , p - > name ) ) {
@ -1067,7 +1092,11 @@ _imp_create_builtin(PyObject *module, PyObject *spec)
return NULL ;
}
def - > m_base . m_init = p - > initfunc ;
if ( _PyImport_FixupExtensionObject ( mod , name , name ) < 0 ) {
if ( modules = = NULL ) {
modules = PyImport_GetModuleDict ( ) ;
}
if ( _PyImport_FixupExtensionObject ( mod , name , name ,
modules ) < 0 ) {
Py_DECREF ( name ) ;
return NULL ;
}
@ -1511,7 +1540,8 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals,
Py_INCREF ( abs_name ) ;
}
mod = PyDict_GetItem ( interp - > modules , abs_name ) ;
PyObject * modules = PyImport_GetModuleDict ( ) ;
mod = PyDict_GetItem ( modules , abs_name ) ;
if ( mod ! = NULL & & mod ! = Py_None ) {
_Py_IDENTIFIER ( __spec__ ) ;
_Py_IDENTIFIER ( _initializing ) ;
@ -1598,7 +1628,8 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals,
goto error ;
}
final_mod = PyDict_GetItem ( interp - > modules , to_return ) ;
PyObject * modules = PyImport_GetModuleDict ( ) ;
final_mod = PyDict_GetItem ( modules , to_return ) ;
Py_DECREF ( to_return ) ;
if ( final_mod = = NULL ) {
PyErr_Format ( PyExc_KeyError ,