diff options
author | Eric Snow <ericsnowcurrently@gmail.com> | 2017-09-14 12:18:12 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-09-14 12:18:12 -0600 |
commit | d393c1b227f22fb9af66040b2b367c99a4d1fa9a (patch) | |
tree | 2bb1bb4f8b59d3c6ffa8dabbc43dc30357e2b25f /Objects | |
parent | 8dcf22f442320e4c1a5408e67b4c9002ad105f17 (diff) | |
download | cpython-git-d393c1b227f22fb9af66040b2b367c99a4d1fa9a.tar.gz |
bpo-28411: Isolate PyInterpreterState.modules (#3575)
A bunch of code currently uses PyInterpreterState.modules directly instead of PyImport_GetModuleDict(). This complicates efforts to make changes relative to sys.modules. This patch switches to using PyImport_GetModuleDict() uniformly. Also, a number of related uses of sys.modules are updated for uniformity for the same reason.
Note that this code was already reviewed and merged as part of #1638. I reverted that and am now splitting it up into more focused parts.
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/moduleobject.c | 12 | ||||
-rw-r--r-- | Objects/typeobject.c | 4 |
2 files changed, 11 insertions, 5 deletions
diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c index 5fab06d31d..2be49fbda3 100644 --- a/Objects/moduleobject.c +++ b/Objects/moduleobject.c @@ -162,11 +162,17 @@ _add_methods_to_object(PyObject *module, PyObject *name, PyMethodDef *functions) 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 dc4d2edc5c..9ebbb21ef8 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -3902,7 +3902,6 @@ import_copyreg(void) { PyObject *copyreg_str; PyObject *copyreg_module; - PyInterpreterState *interp = PyThreadState_GET()->interp; _Py_IDENTIFIER(copyreg); copyreg_str = _PyUnicode_FromId(&PyId_copyreg); @@ -3914,7 +3913,8 @@ import_copyreg(void) 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); + PyObject *modules = PyImport_GetModuleDict(); + copyreg_module = PyDict_GetItemWithError(modules, copyreg_str); if (copyreg_module != NULL) { Py_INCREF(copyreg_module); return copyreg_module; |