Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions Include/import.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ extern "C" {
#endif

#ifndef Py_LIMITED_API
PyAPI_FUNC(_PyInitError) _PyImportZip_Init(void);

PyMODINIT_FUNC PyInit__imp(void);
#endif /* !Py_LIMITED_API */
PyAPI_FUNC(long) PyImport_GetMagicNumber(void);
Expand Down
2 changes: 2 additions & 0 deletions Include/internal/pycore_pylifecycle.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ extern int _PyFloat_Init(void);
extern _PyInitError _Py_HashRandomization_Init(const _PyCoreConfig *);

extern _PyInitError _PyTypes_Init(void);
extern _PyInitError _PyImportZip_Init(PyInterpreterState *interp);


/* Various internal finalizers */

Expand Down
71 changes: 45 additions & 26 deletions Python/import.c
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ _PyImportHooks_Init(void)
}

_PyInitError
_PyImportZip_Init(void)
_PyImportZip_Init(PyInterpreterState *interp)
{
PyObject *path_hooks, *zipimport;
int err = 0;
Expand All @@ -102,14 +102,17 @@ _PyImportZip_Init(void)
goto error;
}

if (Py_VerboseFlag)
int verbose = interp->core_config.verbose;
if (verbose) {
PySys_WriteStderr("# installing zipimport hook\n");
}

zipimport = PyImport_ImportModule("zipimport");
if (zipimport == NULL) {
PyErr_Clear(); /* No zip import module -- okay */
if (Py_VerboseFlag)
if (verbose) {
PySys_WriteStderr("# can't import zipimport\n");
}
}
else {
_Py_IDENTIFIER(zipimporter);
Expand All @@ -118,9 +121,9 @@ _PyImportZip_Init(void)
Py_DECREF(zipimport);
if (zipimporter == NULL) {
PyErr_Clear(); /* No zipimporter object -- okay */
if (Py_VerboseFlag)
PySys_WriteStderr(
"# can't import zipimport.zipimporter\n");
if (verbose) {
PySys_WriteStderr("# can't import zipimport.zipimporter\n");
}
}
else {
/* sys.path_hooks.insert(0, zipimporter) */
Expand All @@ -129,9 +132,9 @@ _PyImportZip_Init(void)
if (err < 0) {
goto error;
}
if (Py_VerboseFlag)
PySys_WriteStderr(
"# installed zipimport hook\n");
if (verbose) {
PySys_WriteStderr("# installed zipimport hook\n");
}
}
}

Expand Down Expand Up @@ -415,22 +418,26 @@ PyImport_Cleanup(void)

/* XXX Perhaps these precautions are obsolete. Who knows? */

if (Py_VerboseFlag)
int verbose = interp->core_config.verbose;
if (verbose) {
PySys_WriteStderr("# clear builtins._\n");
}
if (PyDict_SetItemString(interp->builtins, "_", Py_None) < 0) {
PyErr_WriteUnraisable(NULL);
}

for (p = sys_deletes; *p != NULL; p++) {
if (Py_VerboseFlag)
if (verbose) {
PySys_WriteStderr("# clear sys.%s\n", *p);
}
if (PyDict_SetItemString(interp->sysdict, *p, Py_None) < 0) {
PyErr_WriteUnraisable(NULL);
}
}
for (p = sys_files; *p != NULL; p+=2) {
if (Py_VerboseFlag)
if (verbose) {
PySys_WriteStderr("# restore sys.%s\n", *p);
}
value = _PyDict_GetItemStringWithError(interp->sysdict, *(p+1));
if (value == NULL) {
if (PyErr_Occurred()) {
Expand Down Expand Up @@ -469,8 +476,9 @@ PyImport_Cleanup(void)
}
#define CLEAR_MODULE(name, mod) \
if (PyModule_Check(mod)) { \
if (Py_VerboseFlag && PyUnicode_Check(name)) \
if (verbose && PyUnicode_Check(name)) { \
PySys_FormatStderr("# cleanup[2] removing %U\n", name); \
} \
STORE_MODULE_WEAKREF(name, mod); \
if (PyObject_SetItem(modules, name, Py_None) < 0) { \
PyErr_WriteUnraisable(NULL); \
Expand Down Expand Up @@ -563,20 +571,23 @@ PyImport_Cleanup(void)
if (dict == interp->builtins || dict == interp->sysdict)
continue;
Py_INCREF(mod);
if (Py_VerboseFlag && PyUnicode_Check(name))
if (verbose && PyUnicode_Check(name)) {
PySys_FormatStderr("# cleanup[3] wiping %U\n", name);
}
_PyModule_Clear(mod);
Py_DECREF(mod);
}
Py_DECREF(weaklist);
}

/* Next, delete sys and builtins (in that order) */
if (Py_VerboseFlag)
if (verbose) {
PySys_FormatStderr("# cleanup[3] wiping sys\n");
}
_PyModule_ClearDict(interp->sysdict);
if (Py_VerboseFlag)
if (verbose) {
PySys_FormatStderr("# cleanup[3] wiping builtins\n");
}
_PyModule_ClearDict(interp->builtins);

/* Clear and delete the modules directory. Actual modules will
Expand Down Expand Up @@ -755,9 +766,11 @@ _PyImport_FindExtensionObjectEx(PyObject *name, PyObject *filename,
PyMapping_DelItem(modules, name);
return NULL;
}
if (Py_VerboseFlag)
int verbose = _PyInterpreterState_Get()->core_config.verbose;
if (verbose) {
PySys_FormatStderr("import %U # previously loaded (%R)\n",
name, filename);
name, filename);
}
return mod;

}
Expand Down Expand Up @@ -1427,7 +1440,7 @@ PyImport_ImportModuleNoBlock(const char *name)
/* Remove importlib frames from the traceback,
* except in Verbose mode. */
static void
remove_importlib_frames(void)
remove_importlib_frames(PyInterpreterState *interp)
{
const char *importlib_filename = "<frozen importlib._bootstrap>";
const char *external_filename = "<frozen importlib._bootstrap_external>";
Expand All @@ -1442,8 +1455,10 @@ remove_importlib_frames(void)
which end with a call to "_call_with_frames_removed". */

PyErr_Fetch(&exception, &value, &base_tb);
if (!exception || Py_VerboseFlag)
if (!exception || interp->core_config.verbose) {
goto done;
}

if (PyType_IsSubtype((PyTypeObject *) exception,
(PyTypeObject *) PyExc_ImportError))
always_trim = 1;
Expand Down Expand Up @@ -1853,8 +1868,9 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals,
Py_XDECREF(abs_name);
Py_XDECREF(mod);
Py_XDECREF(package);
if (final_mod == NULL)
remove_importlib_frames();
if (final_mod == NULL) {
remove_importlib_frames(interp);
}
return final_mod;
}

Expand Down Expand Up @@ -2303,13 +2319,16 @@ PyInit__imp(void)
PyObject *m, *d;

m = PyModule_Create(&impmodule);
if (m == NULL)
if (m == NULL) {
goto failure;
}
d = PyModule_GetDict(m);
if (d == NULL)
if (d == NULL) {
goto failure;
_PyCoreConfig *config = &_PyInterpreterState_Get()->core_config;
PyObject *pyc_mode = PyUnicode_FromWideChar(config->check_hash_pycs_mode, -1);
}

const wchar_t *mode = _PyInterpreterState_Get()->core_config.check_hash_pycs_mode;
PyObject *pyc_mode = PyUnicode_FromWideChar(mode, -1);
if (pyc_mode == NULL) {
goto failure;
}
Expand Down
2 changes: 1 addition & 1 deletion Python/pylifecycle.c
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ init_importlib_external(PyInterpreterState *interp)
return _Py_INIT_ERR("external importer setup failed");
}
Py_DECREF(value);
return _PyImportZip_Init();
return _PyImportZip_Init(interp);
}

/* Helper functions to better handle the legacy C locale
Expand Down