bpo-28411: Remove "modules" field from Py_InterpreterState. (#1638)

sys.modules is the one true source.
diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c
index 02a8cf0..89afe29 100644
--- a/Objects/moduleobject.c
+++ b/Objects/moduleobject.c
@@ -161,11 +161,17 @@
 PyObject *
 PyModule_Create2(struct PyModuleDef* module, int module_api_version)
 {
+    if (!_PyImport_IsInitialized(PyThreadState_GET()->interp))
+        Py_FatalError("Python import machinery not initialized");
+    return _PyModule_CreateInitialized(module, module_api_version);
+}
+
+PyObject *
+_PyModule_CreateInitialized(struct PyModuleDef* module, int module_api_version)
+{
     const char* name;
     PyModuleObject *m;
-    PyInterpreterState *interp = PyThreadState_Get()->interp;
-    if (interp->modules == NULL)
-        Py_FatalError("Python import machinery not initialized");
+
     if (!PyModuleDef_Init(module))
         return NULL;
     name = module->m_name;
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index d1a12a7..1d963aa 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -3901,7 +3901,6 @@
 {
     PyObject *copyreg_str;
     PyObject *copyreg_module;
-    PyInterpreterState *interp = PyThreadState_GET()->interp;
     _Py_IDENTIFIER(copyreg);
 
     copyreg_str = _PyUnicode_FromId(&PyId_copyreg);
@@ -3913,7 +3912,7 @@
        by storing a reference to the cached module in a static variable, but
        this broke when multiple embedded interpreters were in use (see issue
        #17408 and #19088). */
-    copyreg_module = PyDict_GetItemWithError(interp->modules, copyreg_str);
+    copyreg_module = _PyImport_GetModuleWithError(copyreg_str);
     if (copyreg_module != NULL) {
         Py_INCREF(copyreg_module);
         return copyreg_module;