@@ -858,6 +858,84 @@ PyImport_ReloadModule(m)
858858}
859859
860860
861+ /* Higher-level import emulator which emulates the "import" statement
862+ more accurately -- it invokes the __import__() function from the
863+ builtins of the current globals. This means that the import is
864+ done using whatever import hooks are installed in the current
865+ environment, e.g. by "ni" or "rexec". */
866+
867+ PyObject *
868+ PyImport_Import (module_name )
869+ PyObject * module_name ;
870+ {
871+ static PyObject * silly_list = NULL ;
872+ static PyObject * builtins_str = NULL ;
873+ static PyObject * import_str = NULL ;
874+ static PyObject * standard_builtins = NULL ;
875+ PyObject * globals = NULL ;
876+ PyObject * import = NULL ;
877+ PyObject * builtins = NULL ;
878+ PyObject * r = NULL ;
879+
880+ /* Initialize constant string objects */
881+ if (silly_list == NULL ) {
882+ import_str = PyString_InternFromString ("__import__" );
883+ if (import_str == NULL )
884+ return NULL ;
885+ builtins_str = PyString_InternFromString ("__builtins__" );
886+ if (builtins_str == NULL )
887+ return NULL ;
888+ silly_list = Py_BuildValue ("[s]" , "__doc__" );
889+ if (silly_list == NULL )
890+ return NULL ;
891+ }
892+
893+ /* Get the builtins from current globals */
894+ globals = PyEval_GetGlobals ();
895+ if (globals != NULL ) {
896+ builtins = PyObject_GetItem (globals , builtins_str );
897+ if (builtins == NULL )
898+ goto err ;
899+ }
900+ else {
901+ /* No globals -- use standard builtins, and fake globals */
902+ PyErr_Clear ();
903+
904+ if (standard_builtins == NULL ) {
905+ standard_builtins =
906+ PyImport_ImportModule ("__builtin__" );
907+ if (standard_builtins == NULL )
908+ return NULL ;
909+ }
910+
911+ builtins = standard_builtins ;
912+ Py_INCREF (builtins );
913+ globals = Py_BuildValue ("{OO}" , builtins_str , builtins );
914+ if (globals == NULL )
915+ goto err ;
916+ }
917+
918+ /* Get the __import__ function from the builtins */
919+ if (PyDict_Check (builtins ))
920+ import = PyObject_GetItem (builtins , import_str );
921+ else
922+ import = PyObject_GetAttr (builtins , import_str );
923+ if (import == NULL )
924+ goto err ;
925+
926+ /* Call the _import__ function with the proper argument list */
927+ r = PyObject_CallFunction (import , "OOOO" ,
928+ module_name , globals , globals , silly_list );
929+
930+ err :
931+ Py_XDECREF (globals );
932+ Py_XDECREF (builtins );
933+ Py_XDECREF (import );
934+
935+ return r ;
936+ }
937+
938+
861939/* Module 'imp' provides Python access to the primitives used for
862940 importing modules.
863941*/
0 commit comments